Maison > développement back-end > C++ > Comment aplatir une structure d'arbre hiérarchique dans une liste plate en utilisant LINQ?

Comment aplatir une structure d'arbre hiérarchique dans une liste plate en utilisant LINQ?

Linda Hamilton
Libérer: 2025-01-29 00:46:10
original
334 Les gens l'ont consulté

How to Flatten a Hierarchical Tree Structure into a Flat List Using LINQ?

La structure de l'affichage plat de Linq

Supposons qu'il existe une structure de données d'arbres en couches représentée par la classe

, chacune ayant un nœud parent, une collecte de sous-nœuds et un groupe d'identifiant.

MyNode Challenge

L'objectif est d'obtenir une liste de tous les objets , y compris les nœuds parents et les sous-codes, en tant que liste plate unique. Cependant, seuls les nœuds doivent être inclus dans la liste des résultats.

Solution MyNode group == 1

Afin d'atteindre ce flamboyant, l'expression LINQ suivante peut être utilisée:

Cette expression est récursive tout au long de la structure des arbres, et l'exposition est aplatie en une seule liste. Il sélectionne tous les sous-codes du nœud et appelle

donnés pour générer de manière récursive. Connectez ensuite cette séquence au nœud actuel pour générer la table de fusion.

Filtre
<code class="language-csharp">IEnumerable<MyNode> Flatten(IEnumerable<MyNode> e) =>
    e.SelectMany(c => Flatten(c.Elements)).Concat(e);</code>
Copier après la connexion

Flatten Une fois l'arborescence aplatie, vous pouvez utiliser la liste des filtres de méthode

et sélectionner uniquement le nœud de

.

L'amélioration du style supplémentaire

Where(...) group == 1 Afin d'améliorer la lisibilité, la méthode

peut être définie comme une fonction d'extension en classe statique:
<code class="language-csharp">var result = flattenedNodes.Where(n => n.group == 1);</code>
Copier après la connexion

a trouvé l'implémentation

Afin de généraliser le processus plat, il peut créer une méthode d'extension générique. Flatten

Cette méthode permet à l'exposition d'aplatir toute structure de données en couches, à condition qu'une fonction soit définie pour récupérer les nœuds de la progéniture de chaque élément.
<code class="language-csharp">public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) =>
    e.SelectMany(c => c.Elements.Flatten()).Concat(e);</code>
Copier après la connexion

pour implémenter ce type générique, appelez simplement la méthode et fournissez les fonctions correspondantes pour extraire la progéniture:

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal