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())
{
}
两者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
请改用 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;
}
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 会将队列的所有项目复制到缓冲区中。
顺便说一句,如果您需要颠倒队列中的顺序,请考虑Stack
改用。它将是 FILO 队列类型。