3

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

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

4

5 回答 5

6

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

Queue myQueue;

foreach (var item in myQueue.Reverse())
{
    // do things
}
于 2012-11-08T09:19:55.083 回答
1

for循环是你的朋友。

你有两个选择

  • 颠倒顺序Queue
  • 使用for循环。
for (int i = list.Length; i >= 0; i--)
{

}

颠倒队列的顺序。

Queue queue;

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

}
于 2012-11-08T09:18:00.760 回答
1

两者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

于 2018-11-26T04:41:49.487 回答
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;
}
于 2012-11-08T09:18:30.710 回答
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 会将队列的所有项目复制到缓冲区中。

顺便说一句,如果您需要颠倒队列中的顺序,请考虑Stack改用。它将是 FILO 队列类型。

于 2012-11-08T09:20:52.260 回答