Utilisez la structure et filtrez de l'arborescence en forme de plats linq selon l'attribut
Dans le domaine des données en forme d'arbre, il est souvent nécessaire de convertir la structure hiérarchique en une liste plate. Supposons que vous ayez un mode de classe en couches avec les attributs parent et éléments, et que vous souhaitez aplatir les arbres en extraitant toutes les instances MyNode dans une seule liste. Plus précisément, vous êtes uniquement intéressé à obtenir des nœuds égaux à 1 dans le groupe.
La requête LINQ suivante vous fournit une solution:
<code class="language-c#">var flatList = rootNodes.SelectMany(node => Flatten(node.Elements)).Concat(rootNodes).Where(node => node.group == 1);</code>
Copier après la connexion
Ce qui suit est son principe de travail:
selectMany (node = & gt; aplaten (node.elements)) - : Cette méthode a aplati de manière récursive la collection d'éléments de chaque mynode pour obtenir la liste plate de toutes les descendants.
Concat (RootNodes)
: Connectez la liste plate de la progéniture à la liste des MyNodes originale. -
où (node = & gt; node.group == 1) : filtrez la liste plate, qui ne contient que des nœuds avec un attribut de groupe 1.
-
Afin d'améliorer la lisibilité du code, veuillez envisager d'utiliser la méthode d'extension pour l'aplatissement:
Utilisez ensuite votre méthode d'extension des appels d'arbre et spécifiez comment récupérer la progéniture:
<code class="language-c#">public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> f) => e.SelectMany(c => f(c).Flatten(f)).Concat(e);</code>
Copier après la connexion
Profitez des avantages apportés par l'utilisation de données à niveau plat LINQ!
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!