2015-05-11 112 views
0

我有一個Person對象的列表。每個人都有一個人名單作爲財產。這是班級。使用LINQ計算樹中符合條件的所有元素

public class Person 
{  
    public List<Person> Team { get; set; } 
    public string Status {get; set;} 
} 

所以每個人都有父母,子女的名單,和狀態。

我需要計算在給定人的樹中狀態等於"X""Y"的次數。我被告知我可以使用.Aggregate()函數,但我不知道我會怎麼做。

例如,如果一個人有3人名單全部用狀態"X"而且每個人的有3人,2狀態"X"和1的狀態"Z"名單,這將是12人總及計數的"X"將9

+0

對於樹(這是一種遞歸數據結構),您應該考慮使用遞歸方法來瀏覽它。 Linq更適合順序結構,或在樹中達到特定深度(實際上是一種順序導航)。 – Kryptos

+0

你的圖是循環的嗎? – Servy

+0

@Servy假設OP使用正確的術語「樹」,那麼根據定義樹就是非循環的。 – dcastro

回答

4

你可以遞歸「扁平化」的樹,像這樣爲例(使用定位後的迭代器):

public class Person 
{ 
    public List<Person> Team { get; set; } 
    public string Status { get; set; } 

    public IEnumerable<Person> Flatten() 
    { 
     yield return this; 

     foreach (var person in Team) 
      foreach (var child in person.Flatten()) 
       yield return child; 
    } 
} 

,然後使用「根」的人,你可以這樣做:

var count = person.Flatten().Count(p => p.Status == "X" || p.Status == "Y"); 

如果您有一羣人,您可以將SelectManyFlatten結合起來。

people.SelectMany(p => p.Flatten()).Count(...)