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);
}
Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top