2012-03-11 67 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) 
{ 
    // ... 
} 

或者的確,正如我在第一個例子中,我們可以通過反向枚舉到集合的構造如QueueList,讓它執行迭代:

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

啊,怎麼我傻的。我想我很困惑,因爲當在列表上調用Reverse時,它會修改原始內容(因爲Reverse不是List的擴展方法)。謝謝:) – Benzino 2012-03-12 00:11:32

2

Reverse()是一個LINQ操作。它用於按照您正在進行交易的序列進行操作。所以你可以做這樣的事情:

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

這將迭代隊列中的項目以相反的順序。實際隊列保持不變。

您可以創建一個新的隊列作爲這樣的現有隊列的反向:

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

'Reverse'是一個運營商? – 2012-03-12 00:00:55

+0

這是我上次檢查時的LINQ方法。 :) – Bernard 2012-03-12 00:02:12

+0

@ M.Babcock - 好的,所以它是一個Linq方法和一個查詢操作符。 – 2012-03-12 00:19:04

1

你有沒有打過電話的Reverse()方法後遍歷隊列?

這裏是MSDN是說在代碼:

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