Maison >développement back-end >C++ >Comment puis-je aplatir une structure d'arbre dans une liste à un niveau à l'aide de LINQ?

Comment puis-je aplatir une structure d'arbre dans une liste à un niveau à l'aide de LINQ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-29 01:06:10180parcourir

How Can I Flatten a Tree Structure into a Single-Level List Using 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn