gpt4 book ai didi

c# - 如何通过 LINQ 展平树?

转载 作者:IT王子 更新时间:2023-10-29 03:38:40 26 4
gpt4 key购买 nike

所以我有简单的树:

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 });

然后您可以使用 Where(...)group 进行过滤。

要获得一些“样式点数”,请将 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(...) 的两侧切换。

关于c# - 如何通过 LINQ 展平树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11830174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com