如何通过LINQ扁平化树? [英] How to flatten tree via LINQ?
问题描述
所以,我有简单的树:
class MyNode
{
public MyNode Parent;
public IEnumerable<MyNode> Elements;
int group = 1;
}
我有一个的IEnumerable&LT; MYNODE&GT;
。我想所有的列表 MYNODE
(包括内部节点对象(元素
))为一个单位名单其中,
组== 1
。如何通过LINQ做这种事?
I have a IEnumerable<MyNode>
. I want to get a list of all MyNode
(including inner node objects (Elements
)) as one flat list Where
group == 1
. How to do such thing via LINQ?
推荐答案
您可以展开树是这样的:
You can flatten a tree like this:
IEnumerable<MyNode> Flatten(IEnumerable<MyNode> e) {
return e.SelectMany(c => Flatten(c.Elements)).Concat(new[] {e});
}
您可以再经过滤组
使用其中,(...)
。
要赚一些点式,转换拼合
来在一个静态类的扩展功能。
To earn some "points for style", convert Flatten
to an extension function in a static class.
public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) {
return e.SelectMany(c => c.Elements.Flatten()).Concat(e);
}
要赚点分还要好作风,转换拼合
来一个通用的扩展方法,它采用树和产生后代的功能:
To earn some points for "even better style", convert Flatten
to a generic extension method that takes a tree and a function that produces descendents:
public static IEnumerable<T> Flatten<T>(
this IEnumerable<T> e,
Func<T,IEnumerable<T>> f)
{
return e.SelectMany(c => f(c).Flatten(f)).Concat(e);
}
调用该函数是这样的:
Call this function like this:
IEnumerable<MyNode> tree = ....
var res = tree.Flatten(node => node.Elements);
如果您需要preFER压扁在pre-顺序而不是在后序,开关周围的 CONCAT(...)的两侧
If you would prefer flattening in pre-order rather than in post-order, switch around the sides of the Concat(...)
.
这篇关于如何通过LINQ扁平化树?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!