首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板