2012-03-11 3 views
2

menthod Reverse() 확장을 사용하고 있지만 아무 것도하지 않는 것 같습니다. MSDN은 지연된 실행으로 구현되지만, 이것을 작동시키지 못한다고 명시하고 있습니다.대기열 반전

내가 어떻게 부르는지 여기에 있습니다.

이 방법은 지연된 실행을 사용하여 구현됩니다

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

     currentPath.Reverse(); 

이것은 MSDN의 말씀입니다. 즉시 반환 값은 작업을 수행하는 데 필요한 모든 정보를 저장하는 객체입니다. 이 메서드가 나타내는 쿼리는 GetEnumerator 메서드를 직접 호출하거나 Visual C#에서 foreach를 사용하거나 Visual Basic에서 For Each를 사용하여 개체가 열거 될 때까지 실행되지 않습니다.

GetEnumerator를 호출하여 무슨 뜻인지 모르겠습니다. 나는 단순히 수행하여 아무 소용이와 함께 다음과 같은 것을 시도했다 :

내가 여기 아주 어리석은 일을하고 있어요 느낌을했습니다
currentPath.Reverse(); 
currentPath.GetEnumerator(); 

이 어떤 도움을 주시면 감사하겠습니다!

답변

11

역순으로 역순을 반환합니다. 원본을 수정하지 않습니다. 반전 항목에서 새로운 큐를 구성,이 같은 시도 :

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

GetEnumerator를 호출에 대한 문서 회담, 그것은 역()에 의해 반환 된 IEnumerable을에 의미

물론
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

'역방향 '은 연산자입니까? –

+0

마지막으로 확인한 것은 LINQ 메서드입니다. :) – Bernard

+0

@ M.Babcock - 알았어. 그래서 Linq 메소드와 쿼리 연산자. –

1

당신이 Reverse() 방법을 호출 한 후 큐 반복 시도?

다음

는 MSDN 코드에서 말하는 무엇 :

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