我有一个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。
答案 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");
如果您有一组人,则可以将SelectMany
与Flatten
合并。
people.SelectMany(p => p.Flatten()).Count(...)