Перевернуть очередь - PullRequest
       20

Перевернуть очередь

3 голосов
/ 12 марта 2012

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

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

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

        currentPath.Reverse();

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

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 12 марта 2012

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

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());
2 голосов
/ 12 марта 2012

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

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

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

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

var newQueue = new Queue<T>(currentPath.Reverse());
1 голос
/ 12 марта 2012

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

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

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