Pregunta

Quiero hacer una primera búsqueda amplia de un árbol usando una Cola

var q = new Queue<T>();

q.Enqueue(Root);

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

Sin embargo, obtengo una "Colección modificada después de la instancia del enumerador". Excepción.

¿Hay algún tipo de C # con el que pueda hacer esto?


Editar: un poco de lectura me hace pensar que podría estar haciendo esto totalmente mal.

¿Hay alguna forma de usar un foreach para salir de una Cola?


esto funciona pero es feo (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);
}
¿Fue útil?

Solución

No puede enumerar un IEnumerable y cambiar el mismo IEnumerable al mismo tiempo. No creo que haya una colección de C # que permita esto.

Otros consejos

La construcción foreach no funcionará aquí.

Puede resolver el problema utilizando un contenedor que proporcione acceso indexado.

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top