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);
}
War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top