首页 >后端开发 >C++ >如何使用LINQ弄平树结构并通过属性过滤?

如何使用LINQ弄平树结构并通过属性过滤?

Patricia Arquette
Patricia Arquette原创
2025-01-29 00:51:14265浏览

How Can I Flatten a Tree Structure and Filter by a Property Using LINQ?

使用LINQ扁平化树形结构并按属性过滤

在树形数据结构领域,经常需要将层次结构转换为扁平列表。假设您有一个具有Parent和Elements属性的分层类MyNode,并且您希望通过将所有MyNode实例提取到单个列表中来扁平化树。具体来说,您只对获取group属性等于1的节点感兴趣。

以下LINQ查询为您提供了解决方案:

<code class="language-c#">var flatList = rootNodes.SelectMany(node => Flatten(node.Elements)).Concat(rootNodes).Where(node => node.group == 1);</code>

以下是其工作原理:

  • SelectMany(node => Flatten(node.Elements)): 此方法递归地扁平化每个MyNode的Elements集合,获得所有后代的扁平化列表。
  • Concat(rootNodes): 将后代的扁平化列表与原始MyNodes列表连接起来。
  • Where(node => node.group == 1): 过滤扁平化列表,仅包含group属性为1的节点。

为了提高代码的可读性,请考虑使用扩展方法进行扁平化:

<code class="language-c#">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>

然后,使用您的树调用扩展方法,并指定如何检索后代:

<code class="language-c#">var flatList = tree.Flatten(node => node.Elements).Where(node => node.group == 1);</code>

享受使用LINQ扁平化层次数据带来的好处!

以上是如何使用LINQ弄平树结构并通过属性过滤?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn