所以我有简单的树:
class MyNode
{
public MyNode Parent;
public IEnumerable<MyNode> Elements;
int group = 1;
}
我有一个IEnumerable<MyNode>
。我想获得所有的清单MyNode
(包括内部节点对象(Elements
)) 作为一个简单的列表Where
group == 1
。如何通过 LINQ 来做这样的事情?
你可以像这样压平一棵树:
IEnumerable<MyNode> Flatten(IEnumerable<MyNode> e) =>
e.SelectMany(c => Flatten(c.Elements)).Concat(new[] { e });
然后您可以按以下条件过滤group
using Where(...)
.
要赚取一些“风格积分”,请转换Flatten
静态类中的扩展函数。
public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) =>
e.SelectMany(c => c.Elements.Flatten()).Concat(e);
要获得“更好的风格”的更多积分,请转换Flatten
一个通用的扩展方法,它采用一棵树和一个从节点生成后代的函数:
public static IEnumerable<T> Flatten<T>(
this IEnumerable<T> e
, Func<T,IEnumerable<T>> f
) => e.SelectMany(c => f(c).Flatten(f)).Concat(e);
像这样调用这个函数:
IEnumerable<MyNode> tree = ....
var res = tree.Flatten(node => node.Elements);
如果您更喜欢在预购而不是后购中进行展平,请切换两侧Concat(...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)