如何反转队列上的迭代?

时间:2012-11-08 09:16:09

标签: c#

foreach循环从最旧的项开始迭代Queue,最后以最新项结束。 如果我需要从最新开始并以最旧的结尾(可能在某些时候中断,因为在大多数情况下我只需要迭代几个最新的项目),该怎么办?

我正在寻找直接有效的解决方案。无需重新创建新对象。

5 个答案:

答案 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