inserendo in una coda mentre la enumera
-
03-07-2019 - |
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);
}
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