使用递归和泛型删除层次结构中的选定节点

本文关键字:节点 层次结构 删除 递归 泛型 | 更新日期: 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属性的基类或接口来约束它。编译器必须知道对象具有属性