2012-11-08 35 views
3

foreach循环遍历从Queue开始从最旧的项目到最新结束。 如果我需要从最新开始并以最老结束(如果在大多数情况下我只需要遍历几个最新项目,可能会中断)会怎么样?如何反向遍历队列?

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

回答

6

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

Queue myQueue; 

foreach (var item in myQueue.Reverse()) 
{ 
    // do things 
} 
+0

这样的函数有多贵? – javapowered

+0

@javapowered比for循环更昂贵。正常的'foreach'循环比'for for'花费更多,但差别非常小,我觉得更好看的代码是值得的。 – webnoob

+0

尝试一下并找出;)Linq查询仅在需要时才被评估,因此,如果您仅使用前几项,我认为您不会真正遇到性能问题。 @webnoob,这听起来适合你吗? –

1

for循环是你的朋友。

你有两个选择

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

} 

逆向队列的顺序。

Queue queue; 

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

} 
+0

你只是要继续编辑这与大家elses答案呢? :) – webnoob

+0

什么用于循环? 'ElementAt'方法?这种方法有多昂贵? – javapowered

+0

for循环肯定更有效率。 –

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; 
} 
+0

索引无法应用于队列 – javapowered

+0

@javapowered发布您的代码,以便我可以修改我的示例以满足您的需求。 – webnoob

+0

为什么在你的代码中使用'List'操作,而问题是关于'Queue'? – javapowered

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队列类型。

+0

为什么简单的事情应该如此复杂? – javapowered

+0

@javapowered因为这使得它们可读。而不是阅读**你如何做事情,我可以阅读** **做了什么 - “反向”。所以,实际上你递减循环的for循环是复杂的(快速但复杂)。 –

+0

我需要性能和便携性。我不在乎可读性。如果可能,应该避免使用纯c#。 – javapowered