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
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
.
L'amélioration du style supplémentaire Where(...)
group == 1
Afin d'améliorer la lisibilité, la méthode
<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
<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!