2016-02-05 103 views
0

我已經創建了下面的類(簡體):遞歸確定子結構

public class ClassItem{ 
     //Sub-Groups 
     public List<ClassItem> Children { get; set; } 
     public Int64 MaxChilds { get; set; } 
     //Properties 
     ......... 
} 

現在我試圖讓每個分支中最大的兒童用遞歸方法上水平。在一定程度上闡明這一點,說我有以下結構:

- ClassItem 1      (5) 
    - ClassItem 1.1     (1) 
     - ClassItem 1.1.1   (0) 
    - ClassItem 1.2     (0) 
    - ClassItem 1.3     (3) 
     - ClassItem 1.3.1   (0) 
     - ClassItem 1.3.2   (0) 
     - ClassItem 1.3.3   (2) 
      - ClassItem 1.3.3.1  (0) 
      - ClassItem 1.3.3.2  (0) 
    - ClassItem 1.4     (5) 
     - ClassItem 1.4.1   (0) 
     - ClassItem 1.4.2   (0) 
     - ClassItem 1.4.3   (0) 
     - ClassItem 1.4.4   (0) 
     - ClassItem 1.4.5   (0) 

括號內的數字是最大的;兒童人數或其子女在其任何分支機構內的子女人數。

我嘗試了很多東西,但它似乎沒有正常工作。我現在有以下幾種:

private void FindMaxChilds(ClassItem classItem, ref Int64 horizontalMaxLevels) { 
      //Count horizontal for each child 
      if (horizontalMaxLevels < classItem.Children.Count) { 
       horizontalMaxLevels = classItem.Children.Count; 
      } 

      foreach (ClassItem cci in classItem.Children) { 
       FindMaxLevels(cci, ref horizontalMaxLevels); 
      } 

      classItem.MaxChilds = horizontalMaxLevels; 
     } 

有人可以幫助我去那裏嗎?

+0

它不應該是'ClassItem 1(11)'?其中1 + 3 + 2 + 5的總和。 –

+0

不是,任何分支的最大兒童數爲5: 1.1有1,1.2有0,1.3有3,1.4有5和1有4有4兒童。 (我不是指最深層次上的所有孩子!) – Sliver2009

+0

那麼爲什麼是1.4(5)呢?因爲所有1.4的孩子都有0個孩子。如果我理解正確,它應該是1.4(0)。 –

回答

3

我把它分成了,DirectChildren和我的孩子們的孩子的輸出。

public static int MaxDirectChidrenPerItem(ClassItem item) 
{ 
    if (item.Children == null || item.Children.Count == 0) 
    { 
     return 0; 
    } 

    int directChildrenCount = item.Children.Count(); 
    int descendantMaxCount = item.Children.Max(child => MaxDirectChidrenPerItem(child)); 
    return Math.Max(directChildrenCount, descendantMaxCount); 
} 
+0

完美地工作,只需要包括寫入屬性。我只是瞎了眼,長期遞歸:-)! – Sliver2009

+0

@ Sliver2009代替將返回值寫入屬性的方法,可以考慮將屬性本身用作get-ter。你可以在我的答案中找到這個例子。 –

2

使用@ OrelEraki的答案,我想你並不需要一個方法,但你可以在一個屬性包裹的一切:

public class ClassItem 
{ 
    public List<ClassItem> Children { get; set; } 
    public Int64 MaxChildren 
    { 
     get 
     { 
      if (this.Children == null || this.Children.Count == 0) 
      { 
       return 0; 
      } 

      int directChildrenCount = this.Children.Count(); 
      int descendantMaxCount = this.Children.Max(child => child.MaxChildren); 
      return Math.Max(directChildrenCount, descendantMaxCount); 
     } 
    } 
} 
+0

看起來像一個非常好/聰明的解決方案,將其包含在一個屬性!然而,我想要一種方法,因此我接受了@OrelEraki的回答 – Sliver2009

+1

只要你有你的解決方案:) –

+0

你可以改變項目。對此。 ?我也想試試這個解決方案,並且看到了這個問題! – Sliver2009