Einfügen in eine Warteschlange, während es Aufzählen
-
03-07-2019 - |
Frage
Ich mag eine Breitensuche eines Baumes tun mit einer Queue
var q = new Queue<T>();
q.Enqueue(Root);
foreach(T root in q)
{
foreach(T t in root.Children)
q.Enqueue(t);
}
Allerdings erhalte ich eine „Collection geändert wurde, nachdem die enumerator instanziiert wurde.“ Ausnahme.
Gibt es einen C # Typen, den ich mit diesem tun?
Edit: ein wenig Lektüre mich, was ich könnte diese total falsch machen.
Gibt es eine Möglichkeit, eine foreach zu verwenden, um von einer Warteschlange aus der Warteschlange entfernt?
Das funktioniert aber ist hässlich (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);
}
Lösung
Sie können eine IEnumerable nicht aufzählen über und die gleiche IEnumerable zur gleichen Zeit ändern. Ich glaube nicht, gibt es eine C # Sammlung, die dies ermöglicht.
Andere Tipps
Das foreach Konstrukt wird hier nicht funktionieren.
Sie können das Problem mit einem Behälter lösen, die einen Index den Zugriff bereitstellt.
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);