首页 > 解决方案 > 选择所有孩子及其孩子

问题描述

从这个数据:

var item1 = new Item(1);
var item2 = new Item(2);
var item3 = new Item(3);
var item4 = new Item(4);
var item5 = new Item(5);
var item6 = new Item(6);
var item7 = new Item(7);
var item8 = new Item(8);

item1.Requirements = new List<Item>() { item2, item3 };
item2.Requirements = new List<Item>() { item4, item5 };
item5.Requirements = new List<Item>() { item6 };
item6.Requirements = new List<Item>() { item8 };

我想得到所有item1的孩子和孩子的孩子。

var items = item1.Requirements.SelectManyRecursive(x => x.Requirements).ToList();

我管理了这段代码:

public static IEnumerable<T> SelectManyRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
{
    var result = source.SelectMany(selector);

    if (!result.Any())
    {
        return result;
    }
    return result.Concat(result.SelectManyRecursive(selector));
}

我预期的结果:

item2, item3, item4, item5, item6, item8

不幸的是,它丢失了item2并且item3. 我可以通过以下方式解决这个问题:

var items = item1.Requirements.Concat(item1.Requirements.SelectManyRecursive(x => x.Requirements)).ToList();

但这看起来很难看。有没有其他方法可以做到这一点?

标签: c#

解决方案


一种方法是使用扩展方法:

public static IEnumerable<T> SelectChildren<T>(this T RootNode, Func<T, IEnumerable<T>> childSelector)
{
    var firstLevelChildren = childSelector(RootNode);
    return firstLevelChildren.Concat(firstLevelChildren.SelectMany(c => SelectChildren(c, childSelector)));
}


var items = item1.SelectChildren(x => x.Requirements);

foreach (var item in items)
{
    Console.WriteLine(item);
}

推荐阅读