Reverter uma fila
-
12-12-2019 - |
Pergunta
Estou usando o método de extensão Reverse(), mas parece não estar fazendo nada.O MSDN afirma que é implementado como uma execução adiada, mas não consigo fazer isso funcionar.
Aqui está como eu chamo isso.
Queue<T> currentPath = new Queue<T>();
currentPath.Enqueue(someValue);
currentPath.Enqueue(someValue2);
currentPath.Reverse();
Isto é o que o MSDN diz:
Este método é implementado usando execução adiada.O valor de retorno imediato é um objeto que armazena todas as informações necessárias para executar a ação.A consulta representada por esse método não é executada até que o objeto seja enumerado chamando seu método GetEnumerator diretamente ou usando foreach no Visual C# ou For Each no Visual Basic.
Não tenho certeza do que significa chamar GetEnumerator.Eu tentei isso simplesmente fazendo o seguinte sem sucesso:
currentPath.Reverse();
currentPath.GetEnumerator();
Tenho a sensação de que estou fazendo algo muito bobo aqui, qualquer ajuda seria apreciada!
Solução
Reverse retorna a sequência invertida.Não modifica o original.Tente algo assim, para construir uma nova Queue a partir dos itens invertidos:
currentPath = new Queue<T>(currentPath.Reverse());
Quando a documentação fala em chamar GetEnumerator, significa no IEnumerable que foi retornado por Reverse():
IEnumerable reversed = currentPath.Reverse();
IEnumerator reversedEnumerator = reversed.GetEnumerator();
// Now reversedEnumerator has assembled the reversed sequence,
// we could change the contents of currentPath and it wouldn't
// affect the order of items in reversedEnumerator.
Claro, raramente há necessidade de obter o recenseador assim, porque foreach
fará isso por nós nos bastidores:
IEnumerable reversed = currentPath.Reverse();
foreach (var item in reversed)
{
// ...
}
Ou de fato, como no meu primeiro exemplo, podemos passar o enumerável invertido para um construtor de coleção como Queue
ou List
e deixe-o realizar a iteração:
currentPath = new Queue<T>(currentPath.Reverse());
Outras dicas
Reverse()
é um operador Linq.É usado para operar em uma sequência na qual você está interagindo.Então você poderia fazer algo assim:
foreach (var value in currentPath.Reverse())
{
// Do something
}
Isso irá iterar sobre os itens na fila na ordem inversa.A fila real permanece inalterada.
Você poderia criar uma nova fila ao contrário da fila existente assim:
var newQueue = new Queue<T>(currentPath.Reverse());
Você já tentou iterar na fila depois de chamar o Reverse()
método?
Aqui está o que o MSDN está dizendo em código:
foreach (T item in currentPath.Reverse())
{
// Do something with current item in queue.
}