首页 > 后端开发 > C++ > 如何使用LINQ将层次树结构变成平坦的列表?

如何使用LINQ将层次树结构变成平坦的列表?

Linda Hamilton
发布: 2025-01-29 00:46:10
原创
334 人浏览过

How to Flatten a Hierarchical Tree Structure into a Flat List Using LINQ?

使用LINQ展平树结构

假设有一个由MyNode类表示的分层树数据结构,其中每个节点都有一个父节点、一个子节点集合和一个组标识符,本文探讨如何使用LINQ将其转换为扁平列表。

挑战

目标是获得所有MyNode对象的列表,包括父节点和子节点,作为一个单一的扁平列表。但是,只有group == 1的节点应该包含在结果列表中。

解决方案

为了实现这种展平,可以使用以下LINQ表达式:

<code class="language-csharp">IEnumerable<MyNode> Flatten(IEnumerable<MyNode> e) =>
    e.SelectMany(c => Flatten(c.Elements)).Concat(e);</code>
登录后复制

此表达式递归遍历树结构,将其展平为单个列表。它选择给定节点的所有子节点,并对其递归调用Flatten,生成子节点序列。然后将此序列与当前节点连接起来,生成合并列表。

按组过滤

一旦树被展平,可以使用Where(...)方法过滤列表,只选择group == 1的节点。

<code class="language-csharp">var result = flattenedNodes.Where(n => n.group == 1);</code>
登录后复制

附加样式增强

为了提高可读性,Flatten方法可以定义为静态类中的扩展函数:

<code class="language-csharp">public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) =>
    e.SelectMany(c => c.Elements.Flatten()).Concat(e);</code>
登录后复制

泛型实现

为了使展平过程通用化,可以创建一个泛型扩展方法,它接受一个树结构和一个函数,以从节点生成后代:

<code class="language-csharp">public static IEnumerable<T> Flatten<T>(
    this IEnumerable<T> e,
    Func<T, IEnumerable<T>> f
) => e.SelectMany(c => f(c).Flatten(f)).Concat(e);</code>
登录后复制

这种方法允许展平任何分层数据结构,前提是定义了一个函数来从每个元素检索后代节点。

要使用此泛型实现,只需调用Flatten方法并提供相应的函数来提取后代即可:

<code class="language-csharp">var res = tree.Flatten(node => node.Elements);</code>
登录后复制

以上是如何使用LINQ将层次树结构变成平坦的列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板