使用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>
以下是详细解释:
扩展方法版本
为了提高代码可读性,您可以将扁平化函数转换为扩展方法:
<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中文网其他相关文章!