La plupart des réponses présentées ici produisent profondeur d'abord ou des séquences en zig-zag. Par exemple, à partir de l'arbre ci-dessous :
1 2
/ \ / \
/ \ / \
/ \ / \
/ \ / \
11 12 21 22
/ \ / \ / \ / \
/ \ / \ / \ / \
111 112 121 122 211 212 221 222
dasblinkenlight's réponse produit cette séquence aplatie :
111, 112, 121, 122, 11, 12, 211, 212, 221, 222, 21, 22, 1, 2
Konamiman réponse (qui généralise la méthode d'Eric Lippert réponse ) produit cette séquence aplatie :
2, 22, 222, 221, 21, 212, 211, 1, 12, 122, 121, 11, 112, 111
Ivan Stoev réponse produit cette séquence aplatie :
1, 11, 111, 112, 12, 121, 122, 2, 21, 211, 212, 22, 221, 222
Si vous êtes intéressé par un en premier lieu séquence comme celle-ci :
1, 2, 11, 12, 21, 22, 111, 112, 121, 122, 211, 212, 221, 222
...alors cette solution est faite pour vous :
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> source,
Func<T, IEnumerable<T>> childrenSelector)
{
var queue = new Queue<T>(source);
while (queue.Count > 0)
{
var current = queue.Dequeue();
yield return current;
var children = childrenSelector(current);
if (children == null) continue;
foreach (var child in children) queue.Enqueue(child);
}
}
La différence dans l'implémentation consiste essentiellement à utiliser une Queue
au lieu d'un Stack
. Aucun tri réel n'a lieu.
Attention : cette implémentation est loin d'être optimale en ce qui concerne l'efficacité de la mémoire, puisqu'un grand pourcentage du nombre total d'éléments finira par être stocké dans la file d'attente interne pendant l'énumération. Stack
-sont beaucoup plus efficaces en termes d'utilisation de la mémoire que les parcours d'arbres basés sur les Queue
-Les implémentations basées sur l'Internet.
1 votes
Dans quel ordre voulez-vous que la liste soit aplatie ?
1 votes
Quand les nœuds cessent-ils d'avoir des nœuds enfants ? Je suppose que c'est quand
Elements
est nulle ou vide ?0 votes
Pourrait faire double emploi avec stackoverflow.com/questions/11827569/
0 votes
Le moyen le plus simple et le plus clair de résoudre ce problème consiste à utiliser une requête LINQ récursive. Cette question : stackoverflow.com/questions/732281/expressing-recursion-in-linq a beaucoup de discussions à ce sujet, et este Une réponse particulière explique en détail comment la mettre en œuvre.