Linq SelectMany将所有嵌套对象作为展平列表返回(非递归解决方案)

时间:2019-06-23 18:55:04

标签: c# linq

我正在寻找不依赖于递归的解决方案

我想使用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是一个单独的实体,只是在层次结构中处于不同的位置。

0 个答案:

没有答案