menggunakan linq untuk meratakan struktur pokok ke dalam satu senarai
Linq menawarkan penyelesaian yang elegan untuk struktur seperti pokok-struktur-struktur di mana nod mengandungi unsur-unsur kanak-kanak-ke dalam senarai satu peringkat. Ini memudahkan lelaran ke atas semua nod, tanpa mengira kedalaman hierarki mereka.
Proses meratakan
Berikut adalah kaedah berasaskan Linq untuk mencapai ini:
<code class="language-csharp">public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) { return e.SelectMany(c => c.Elements.Flatten()).Concat(e); }</code>
) untuk setiap nod, rekursif meratakan kanak -kanak itu, dan kemudian menggabungkan kanak -kanak yang diratakan dengan nod asal. c.Elements
Penapisan senarai yang diratakan
Selepas meratakan, anda boleh dengan mudah menapis senarai yang dihasilkan menggunakan klausaWhere
group
<code class="language-csharp">IEnumerable<MyNode> filteredNodes = flattenedNodes.Where(node => node.group == 1);</code>
untuk kejelasan kod yang lebih baik dan kebolehgunaan semula:
Kaedah lanjutan
Kaedah lebih baik dilaksanakan sebagai kaedah lanjutan : Ini menjadikan kod lebih mudah dibaca dan intuitif. Flatten
IEnumerable<MyNode>
Untuk kebolehgunaan yang lebih luas, kaedah lanjutan generik boleh dibuat, menerima struktur pokok dan fungsi untuk mengambil keturunan dari nod:
<code class="language-csharp">public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> f) { return e.SelectMany(c => f(c).Flatten(f)).Concat(e); }</code>
Aplikasi praktikal
untuk menggunakan kaedah
, hanya panggilnya pada akar pokok anda:
Flatten
<code class="language-csharp">IEnumerable<MyNode> tree = ...; // Your tree structure var flattenedNodes = tree.Flatten();</code>
Atas ialah kandungan terperinci Bagaimana saya boleh meratakan struktur pokok ke dalam senarai satu peringkat menggunakan linq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!