inserir em uma fila enquanto a enumera
-
03-07-2019 - |
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);
}
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