c# - 选择所有孩子及其孩子
问题描述
从这个数据:
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();
但这看起来很难看。有没有其他方法可以做到这一点?
解决方案
一种方法是使用扩展方法:
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);
}
推荐阅读
- python - Django 3.2.3 我正在尝试使用其字段和属性方法序列化对象
- jmeter - 如何使用 Jmeter 中的相关性在下拉列表中动态选择帐户
- mysql - 返回具有至少两次出现在表中的值的总行数
- node.js - 如何解决 catch { } // eslint-disable-line 问题?
- sql - 按 ID 过滤 - 完全匹配或获取默认记录
- python - 如何比较段落之间的相似性 NLP
- java - 等于实现测试覆盖率junit java
- python - IBM 识别失败
- xcode - 有什么方法可以弱添加 Swift 包?
- powerbi - 为 Power BI 中的多个相似列创建单个切片器