使用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中文網其他相關文章!