在树形数据结构领域,经常需要将层次结构转换为扁平列表。假设您有一个具有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>
以下是其工作原理:
为了提高代码的可读性,请考虑使用扩展方法进行扁平化:
<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中文网其他相关文章!