使用递归和泛型删除层次结构中的选定节点
本文关键字:节点 层次结构 删除 递归 泛型 | 更新日期: 2023-09-27 18:24:16
我想用一个打开的Generic T
来展平对象的层次结构。
此链接递归列表展平
展示了如何获取通过的IEnumerable。但我想压平通过的物体T和
其属性Children。
U1.Children(U2,U3,U4)
U2.Children(U9,U10)
U3.Children(U11,U12)
U4.Children(U20,U30)
我转到方法U1
(选定的节点),我想得到这个平面列表:
U1,U2,U3,U4,U9,U10,U11,U12,U20,U30
这在某种程度上是可能的吗?
您可以定义一个递归扩展方法,该方法接受用于检索子级的函数:
public static IEnumerable<T> Flatten<T>(this T root, Func<T, IEnumerable<T>> getChildren)
{
IEnumerable<T> rootSingleton = new T[] { root };
IEnumerable<T> children = getChildren(root);
IEnumerable<T> descendants = children.SelectMany(child => Flatten(child, getChildren));
return rootSingleton.Concat(descendants);
}
然后,你可以这样消费:
var flat = u1.Flatten(u => u.Children);
如果您的层次结构只有一个级别的深度,您可以使用带联合的select many
public IEnumerable<T> Flattern<T>(IEnumerable<T> input) where T : ISomeinterface {
return input.SelectMany(t=> t.Children).Union(input)
}
这段代码不会编译unes——你会用一些具有Children
属性的基类或接口来约束它。编译器必须知道对象具有属性