foreach
循环从最旧的项开始迭代Queue
,最后以最新项结束。
如果我需要从最新开始并以最旧的结尾(可能在某些时候中断,因为在大多数情况下我只需要迭代几个最新的项目),该怎么办?
我正在寻找直接有效的解决方案。无需重新创建新对象。
答案 0 :(得分:6)
您可以使用Linq的Reverse()
功能:
Queue myQueue;
foreach (var item in myQueue.Reverse())
{
// do things
}
答案 1 :(得分:1)
for
循环是你的朋友。
您有两个选项
Queue
for
循环。for (int i = list.Length; i >= 0; i--) { }
撤消队列的顺序。
Queue queue;
foreach (var item in queue.Reverse())
{
}
答案 2 :(得分: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;
}
答案 3 :(得分: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队列类型。
答案 4 :(得分:0)
Reverse()
和ToArray()
的性能都不好。如果可能,请将Queue<T>
更改为LinkedList<T>
。
LinkedList就像双端队列(https://en.wikipedia.org/wiki/Double-ended_queue)。
更多详细信息:https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.linkedlist-1