首页 > 后端开发 > C++ > LINQ如何有效地平整层次数据并通过特定的属性值过滤?

LINQ如何有效地平整层次数据并通过特定的属性值过滤?

Susan Sarandon
发布: 2025-01-29 01:01:09
原创
541 人浏览过

How Can LINQ Efficiently Flatten Hierarchical Data and Filter by a Specific Property Value?

使用LINQ扁平化层级数据

树状数据结构中,常常需要从嵌套层级中提取节点的扁平列表。例如,考虑一个具有“Elements”属性的“MyNode”对象,该属性包含子节点集合。为了获得具有特定属性值的全部节点的扁平列表,LINQ提供了一种优雅的解决方案。

解决方案

要在一个LINQ查询中扁平化树并筛选特定属性值,请按照以下步骤操作:

<code class="language-csharp">// 扁平化树
IEnumerable<mynode> flatTree = e.SelectMany(c => Flatten(c.Elements)).Concat(new[] { e });

// 按属性值筛选扁平化列表
var result = flatTree.Where(n => n.group == 1);</code>
登录后复制

以下是详细解释:

  • Flatten(c.Elements): 此部分递归地扁平化原始集合中每个节点的子节点。
  • Concat(new[] { e }): 这将当前节点附加到扁平化的子节点列表。
  • Where(n => n.group == 1): 此子句筛选扁平化列表,仅包含具有所需“group”值的节点。

扩展方法版本

为了提高代码可读性,您可以将扁平化函数转换为扩展方法:

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

自定义树的泛型版本

对于结构与“MyNode”不同的树,您可以使用扁平化函数的泛型版本,该版本采用一个函数来检索子节点:

<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>
登录后复制

示例用法

要扁平化“MyNode”树并筛选“group”等于1的节点:

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

通过理解树扁平化的概念并应用LINQ强大的操作,您可以高效地从复杂的层级结构中提取和操作数据。

以上是LINQ如何有效地平整层次数据并通过特定的属性值过滤?的详细内容。更多信息请关注PHP中文网其他相关文章!

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