0

我想用开放的 Generic 展平对象层次结构T

此链接Recursive List Flattening

展示了如何通过一个传递的 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

这可能以某种通用方式吗?

4

2 回答 2

2

您可以定义一个递归扩展方法,该方法接受一个用于检索子项的函数:

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);
于 2012-02-13T20:15:25.377 回答
0

如果您的层次结构只有一级深度,您可以使用 select many with union

public IEnumerable<T> Flattern<T>(IEnumerable<T> input) where T : ISomeinterface {
    return input.SelectMany(t=> t.Children).Union(input)
}

好吧,这段代码不会编译,除非你用一些具有Children属性的基类或接口来约束它。编译器必须知道该对象具有该属性

于 2012-02-13T20:11:29.717 回答