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
Linda Hamiltonoriginal
2025-01-29 00:46:10371parcourir

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>

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>

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>

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!

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