foreach
循環遍歷從Queue
開始從最舊的項目到最新結束。 如果我需要從最新開始並以最老結束(如果在大多數情況下我只需要遍歷幾個最新項目,可能會中斷)會怎麼樣?如何反向遍歷隊列?
我正在尋找直接和有效的解決方案。無需重新創建新對象。
foreach
循環遍歷從Queue
開始從最舊的項目到最新結束。 如果我需要從最新開始並以最老結束(如果在大多數情況下我只需要遍歷幾個最新項目,可能會中斷)會怎麼樣?如何反向遍歷隊列?
我正在尋找直接和有效的解決方案。無需重新創建新對象。
你可以使用Linq的Reverse()
功能:
Queue myQueue;
foreach (var item in myQueue.Reverse())
{
// do things
}
for
循環是你的朋友。
你有兩個選擇
Queue
for
循環的順序。for (int i = list.Length; i >= 0; i--) { }
逆向隊列的順序。
Queue queue;
foreach (var item in queue.Reverse())
{
}
你只是要繼續編輯這與大家elses答案呢? :) – webnoob
什麼用於循環? 'ElementAt'方法?這種方法有多昂貴? – javapowered
for循環肯定更有效率。 –
改爲使用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;
}
索引無法應用於隊列 – javapowered
@javapowered發佈您的代碼,以便我可以修改我的示例以滿足您的需求。 – webnoob
爲什麼在你的代碼中使用'List'操作,而問題是關於'Queue'? – javapowered
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隊列類型。
爲什麼簡單的事情應該如此複雜? – javapowered
@javapowered因爲這使得它們可讀。而不是閱讀**你如何做事情,我可以閱讀** **做了什麼 - 「反向」。所以,實際上你遞減循環的for循環是複雜的(快速但複雜)。 –
我需要性能和便攜性。我不在乎可讀性。如果可能,應該避免使用純c#。 – javapowered
這樣的函數有多貴? – javapowered
@javapowered比for循環更昂貴。正常的'foreach'循環比'for for'花費更多,但差別非常小,我覺得更好看的代碼是值得的。 – webnoob
嘗試一下並找出;)Linq查詢僅在需要時才被評估,因此,如果您僅使用前幾項,我認爲您不會真正遇到性能問題。 @webnoob,這聽起來適合你嗎? –