Domanda

Voglio fare una prima ricerca ampia di un albero usando una coda

var q = new Queue<T>();

q.Enqueue(Root);

foreach(T root in q)
{
  foreach(T t in root.Children)
    q.Enqueue(t);
}

Comunque ottengo che una raccolta " è stata modificata dopo l'istanza dell'enumeratore. " Eccezione.

Esiste un tipo C # con cui posso farlo?


Modifica: una piccola lettura mi fa pensare che potrei sbagliarmi.

C'è un modo per usare un foreach per accodare da una coda?


funziona ma è brutto (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);
}
È stato utile?

Soluzione

Non è possibile enumerare un IEnumerable e modificare lo stesso IEnumerable contemporaneamente. Non credo che esista una collezione C # che lo consenta.

Altri suggerimenti

Il costrutto foreach non funzionerà qui.

Puoi risolvere il problema usando un contenitore che fornisce accesso indicizzato.

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top