2012-11-08 34 views
3

foreach循環遍歷從Queue開始從最舊的項目到最新結束。 如果我需要從最新開始並以最老結束(如果在大多數情況下我只需要遍歷幾個最新項目,可能會中斷)會怎麼樣?如何反向遍歷隊列?

我正在尋找直接和有效的解決方案。無需重新創建新對象。

回答

6

你可以使用Linq的Reverse()功能:

Queue myQueue; 

foreach (var item in myQueue.Reverse()) 
{ 
    // do things 
} 
+0

這樣的函數有多貴? – javapowered

+0

@javapowered比for循環更昂貴。正常的'foreach'循環比'for for'花費更多,但差別非常小,我覺得更好看的代碼是值得的。 – webnoob

+0

嘗試一下並找出;)Linq查詢僅在需要時才被評估,因此,如果您僅使用前幾項,我認爲您不會真正遇到性能問題。 @webnoob,這聽起來適合你嗎? –

1

for循環是你的朋友。

你有兩個選擇

  • 反轉Queue
  • 使用for循環的順序。
for (int i = list.Length; i >= 0; i--) 
{ 

} 

逆向隊列的順序。

Queue queue; 

foreach (var item in queue.Reverse()) 
{ 

} 
+0

你只是要繼續編輯這與大家elses答案呢? :) – webnoob

+0

什麼用於循環? 'ElementAt'方法?這種方法有多昂貴? – javapowered

+0

for循環肯定更有效率。 –

0

改爲使用for循環。

編輯:添加如何檢索循環內的項目的示例。

編輯:改變例如到Queue但我不知道,不檢查,如果這是現在更貴,使用QueueList.Reverse()

反向

for (int i = QueueList.Count; i >= 0; i--) 
{ 
    var Item = QueueList.ToArray().ToList()[i] as SomeObject; 
} 

普通

for (int i = 0; i < QueueList.Count; i++) 
{ 
    var Item = QueueList.ToArray().ToList()[i] as SomeObject; 
} 
+0

索引無法應用於隊列 – javapowered

+0

@javapowered發佈您的代碼,以便我可以修改我的示例以滿足您的需求。 – webnoob

+0

爲什麼在你的代碼中使用'List'操作,而問題是關於'Queue'? – javapowered

0
var newestItems = queue.Reverse().TakeWhile(item => IsNewest(item)); 
// if condition is simple, you can use lambda without creating named method 

及更高版本:

foreach(var item in newestItems) 
    // do stuff 

可讀,但價格昂貴。在這種情況下(當使用Reverse時)Linq會將隊列的所有項目複製到緩衝區中。

BTW如果您需要排隊排隊,則考慮使用Stack代替。它將是FILO隊列類型。

+0

爲什麼簡單的事情應該如此複雜? – javapowered

+0

@javapowered因爲這使得它們可讀。而不是閱讀**你如何做事情,我可以閱讀** **做了什麼 - 「反向」。所以,實際上你遞減循環的for循環是複雜的(快速但複雜)。 –

+0

我需要性能和便攜性。我不在乎可讀性。如果可能,應該避免使用純c#。 – javapowered