使用LINQ计算树中满足条件的所有元素

时间:2015-05-11 15:27:20

标签: c# linq

我有一个Person个对象的列表。每个人都有一个人员列表作为财产。这是班级。

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

因此,每个人都有父母,孩子的名单和状态。

我需要计算某个人树中状态等于"X""Y"的次数。我被告知我可以使用.Aggregate()功能,但我不确定我会怎么做。

例如,如果一个人有一个包含状态"X"的3个人的列表,并且每个人都有3个人的列表,2个状态为"X",1个状态为{{1} },总共12人,"Z"的计数为9。

1 个答案:

答案 0 :(得分: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;
    } 
}

然后,使用“root”人,你可以这样做:

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

如果您有一组人,则可以将SelectManyFlatten合并。

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