2012-03-11 4 views
2

Я использую расширение menthod Reverse(), но, похоже, он ничего не делает. MSDN заявляет, что оно реализовано как отсроченное исполнение, однако я не могу заставить его работать.Reverse a Queue

Вот как я это называю.

 Queue<T> currentPath = new Queue<T>(); 
     currentPath.Enqueue(someValue); 
     currentPath.Enqueue(someValue2); 

     currentPath.Reverse(); 

Это то, что говорит MSDN:

Этот метод реализуется с использованием отложенного выполнения. Непосредственное возвращаемое значение - это объект, который хранит всю информацию, необходимую для выполнения действия. Запрос, представленный этим методом, не выполняется до тех пор, пока объект не будет перечислен, либо вызвав его метод GetEnumerator напрямую, либо используя foreach в Visual C# или для каждого в Visual Basic.

Я не уверен, что это значит, вызвав GetEnumerator. Я пытался, что просто выполнив следующие действия, не помогло:

currentPath.Reverse(); 
currentPath.GetEnumerator(); 

У меня есть чувство, что я делаю что-то довольно глупо здесь, любая помощь будет оценен по достоинству!

ответ

11

Обратный возвращает обратную последовательность. Он не изменяет оригинал. Попробуйте что-то вроде этого, чтобы построить новую очередь из отмененных пунктов:

currentPath = new Queue<T>(currentPath.Reverse()); 

Когда документация говорит о вызове GetEnumerator, это означает, что на IEnumerable, который был возвращен 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. 

конечно, есть редко возникает необходимость получить нумератор, как это, потому что foreach будет делать это для нас под одеялом:

IEnumerable reversed = currentPath.Reverse(); 
foreach (var item in reversed) 
{ 
    // ... 
} 

Или в самом деле, как и в моем первом примере, мы можем передать обращенную перечислимы конструктору коллекцию, такие как Queue или List и пусть он выполняет итерацию:

currentPath = new Queue<T>(currentPath.Reverse()); 
+0

Ах, как глупо с моей стороны. Я думаю, что я запутался, потому что когда Reverse вызывается в списке, он изменяет оригинал (поскольку Reverse не является методом расширения для List).Спасибо :) – Benzino

2

Reverse() является оператором Linq. Он используется для работы над последовательностью, в которой вы взаимодействуете. Таким образом, вы можете сделать следующее:

foreach (var value in currentPath.Reverse()) 
{ 
    // Do something 
} 

Это будет перебирать элементы в очереди в обратном порядке. Фактическая очередь остается неизменной.

Вы можете создать новую очередь в реверсе существующей очереди, как это:

var newQueue = new Queue<T>(currentPath.Reverse()); 
+0

'Reverse' является оператором? –

+0

Это метод LINQ, который я проверил в последний раз. :) – Bernard

+0

@ M.Babcock - Хорошо, так что это метод Linq и оператор запроса. –

1

Вы пробовали итерацию по очереди после вызова метода Reverse()?

Вот что MSDN говорит в коде:

foreach (T item in currentPath.Reverse()) 
{ 
    // Do something with current item in queue. 
}