Maison >développement back-end >C++ >Comment puis-je aplatir une structure d'arbre dans une liste à un niveau à l'aide de LINQ?
en utilisant LINQ pour aplatir les structures des arbres dans une seule liste
Linq offre une solution élégante pour aplatir les structures en forme d'arbres - les structures Data où les nœuds contiennent des éléments enfants - dans une liste de niveaux à un niveau. Cela simplifie l'itération sur tous les nœuds, quelle que soit leur profondeur hiérarchique.
Le processus d'aplatissement
Voici une méthode basée sur Linq pour y parvenir:
<code class="language-csharp">public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) { return e.SelectMany(c => c.Elements.Flatten()).Concat(e); }</code>
Cette fonction récursive aplatit efficacement l'arbre. Il fonctionne en sélectionnant tous les éléments enfants (c.Elements
) pour chaque nœud, en aplatissant récursivement ces enfants, puis en concaténant les enfants aplatis avec le nœud d'origine.
Filtrage de la liste aplatie
Après l'aplatissement, vous pouvez facilement filtrer la liste résultante à l'aide de la clause Where
de Linq. Par exemple, pour sélectionner les nœuds avec une valeur de propriété group
de 1:
<code class="language-csharp">IEnumerable<MyNode> filteredNodes = flattenedNodes.Where(node => node.group == 1);</code>
Méthodes améliorées et génériques
pour améliorer la clarté du code et la réutilisabilité:
Méthode d'extension: La méthode Flatten
est mieux implémentée en tant que méthode d'extension de IEnumerable<MyNode>
: Cela rend le code plus lisible et intuitif.
Méthode générique: Pour une applicabilité plus large, une méthode d'extension générique peut être créée, acceptant une structure d'arbre et une fonction pour récupérer les descendants à partir d'un nœud:
<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>
Cette version générique permet l'aplatissement de toute structure en forme d'arbre.
Application pratique
pour utiliser la méthode Flatten
, appelez-le simplement sur la racine de votre arbre:
<code class="language-csharp">IEnumerable<MyNode> tree = ...; // Your tree structure var flattenedNodes = tree.Flatten();</code>
Cette approche concise exploite la puissance de Linq pour gérer et traiter efficacement les données hiérarchiques complexes, offrant une solution propre et maintenable pour l'aplatissement des arbres et le filtrage ultérieur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!