7
votes

Traverser fonctionnellement un arbre en c #

Considérez la méthode d'extension suivante en C #, Traverse:

var node = GetParentNode();
return node.Traverse( node => node.Children )
           .Select( node => GetParentName(node) + ":" + node.Name );


0 commentaires

3 Réponses :


9
votes

Je pense que l'astuce est de simplement ne pas transmettre un type type . Au lieu de transmettre le nœud et c'est un chemin qualifié. Par exemple xxx


4 commentaires

Je saisis juste dans la même réponse :) (sauf que vous n'avez pas besoin de "avec" en C # :)


@Tony, bonne prise sur le avec. Travailler en 4 langues chaque jour n'est pas bon pour les réponses cohérentes :)


@Tony, style Twitter Commentaires Pour vous allez regarder terriblement drôle lorsque vous retournez à Jon


Ouais. Je suis "hâte" à une série de questions de méta poser pourquoi Tony a changé son nom, aussi ...



0
votes

Eh bien, je ne pense pas que vous puissiez éviter l'arbre jusqu'à ce que vous trouviez le nœud que vous recherchez sans stocker un pointeur parent.

Vous allez commencer à partir de la racine. Testez le nœud actuel pour une correspondance. S'il s'agit d'une correspondance, renvoyez le nœud ou juste le nom (comme liste de cet élément unique). Sinon, s'il s'agit d'un nœud de feuille, renvoyez NULL. Si ce n'est pas une feuille, traverser ses enfants et si les enfants renvoient la valeur non nulle, préparez le nœud actuel à votre liste et renvoyez cela.

retour de l'appel original, NULL signifie Aucun match trouvé. Sinon, vous aurez votre liste de nœuds dans l'ordre.


0 commentaires

3
votes

solution la plus claire et la plus réutilisable:

Créer une méthode générique qui énumère tous les chemins possibles: xxx

L'énumération résultante peut être facilement transformée en votre représentation de chaîne. < / p> xxx


0 commentaires