insertion dans une file d'attente en l'énumérant
-
03-07-2019 - |
Question
Je souhaite effectuer une première recherche approfondie dans un arbre à l'aide d'une file d'attente
var q = new Queue<T>();
q.Enqueue(Root);
foreach(T root in q)
{
foreach(T t in root.Children)
q.Enqueue(t);
}
Cependant, je reçois une "collection a été modifiée après l’instanciation de l’énumérateur". Exception.
Existe-t-il un type de C # avec lequel je peux faire cela?
Edit: un peu de lecture me fait penser que je pourrais le faire totalement faux.
Y a-t-il un moyen d'utiliser un foreach pour sortir d'une file d'attente?
cela fonctionne mais est moche (OMHO)
var q = new Queue<T>();
q.Enqueue(Root);
while(q.Count > 0)
{
T root = q.Dequeue();
foreach(T t in root.Children)
q.Enqueue(t);
}
La solution
Vous ne pouvez pas énumérer sur un IEnumerable et changer le même IEnumerable en même temps. Je ne pense pas qu’il existe une collection C # qui permette cela.
Autres conseils
La construction foreach ne fonctionnera pas ici.
Vous pouvez résoudre le problème à l'aide d'un conteneur offrant un accès indexé.
var l = new List<T>();
l.Add(Root);
int i = 0;
while(i < l.Count)
{
T root = l[i];
foreach(T t in root.Children)
{
l.Add(t);
}
++i;
}
// And because you really wanted a queue
var q = new Queue<T>(l);