Pergunta

Eu quero fazer uma primeira pesquisa de uma árvore usando uma fila

var q = new Queue<T>();

q.Enqueue(Root);

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

No entanto, recebo uma "coleção foi modificada depois que o enumerador foi instanciado". Exceção.

Existe um tipo C# com o qual posso fazer isso?


EDIT: Uma pequena leitura me faz coisas que eu posso estar fazendo isso totalmente errado.

Existe uma maneira de usar um foreach para desviar de uma fila?


Isso funciona, mas é feio (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);
}
Foi útil?

Solução

Você não pode enumerar sobre um ienumerable e mudar o mesmo ienumerable ao mesmo tempo. Eu não acho que exista uma coleção C# que permitirá isso.

Outras dicas

o para cada Construct não funcionará aqui.

Você pode resolver o problema usando um contêiner que fornece acesso 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top