我正在寻找不依赖于递归的解决方案
我想使用Linq遍历类型为'foo'的对象,该对象可以具有类型为List(foo)的childFoos属性。我想在每个级别上返回所有foo类型的对象的平面列表。
由于此嵌套最多只能有4个深度。我已经写了一个递归算法来满足我的需要,但是我被要求使用Linq来展平对象。我是Linq的新手,但似乎还没做好。
出于本单元测试的目的,我们可以假定始终存在4级深度的数据。到目前为止,我唯一的成功就是在级别1上使用SelectMany,并将其保存到变量中,然后如果它具有foos,则对级别2再次执行相同操作。这看起来不是特别整洁,我想更精简一些。
//My level by level code:
int level1Count = 0, level2Count = 0, level3Count = 0, level4Count = 0;
IEnumerable<Foo> level1Foos, level2Foos, level3Foos, level4Foos;
if (level1Foos.Any())
{
level1Count = level1Foos.Count();
level2Foos = level1Foos
.SelectMany(x => x.ChildFoos);
if (level2Foos.Any())
{
level2Count = level2Foos.Count();
level3Foos = level2Foos
.SelectMany(X => X.ChildFoos);
if (level3Foos.Any())
{
level3Count = level3Foos.Count();
level4Foos = level3Foos
.SelectMany(x => x.ChildFoos);
if (level4Foos.Any())
{
level4Count = level4Foos.Count();
}
}
}
}
totalChildFoos += level1Count + level2Count + level3Count + level4Count;
// What I would like/am attempting
var allFoos = resultFoos
.SelectMany(a => a.ChildFoos)
.SelectMany(b => b.ChildFoos)
.SelectMany(c => c.ChildFoos)
.SelectMany(d => d.ChildFoos);
有一个宽度为4的列表,此代码仅返回最后一个foo,我明白了为什么。我不知道如何在SelectMany的每个级别上选择foo。
我已经阅读了很多有关多级选择的SelectMany答案,但是我还没有看到任何对非递归类型的子对象进行操作的答案。每个Foo是一个单独的实体,只是在层次结构中处于不同的位置。