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!

Foi útil?

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.
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top