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())
{
}
你只是要继续编辑这与大家elses答案呢? :) – webnoob
什么用于循环? 'ElementAt'方法?这种方法有多昂贵? – javapowered
for循环肯定更有效率。 –
改为使用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;
}
索引无法应用于队列 – javapowered
@javapowered发布您的代码,以便我可以修改我的示例以满足您的需求。 – webnoob
为什么在你的代码中使用'List'操作,而问题是关于'Queue'? – javapowered
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队列类型。
为什么简单的事情应该如此复杂? – javapowered
@javapowered因为这使得它们可读。而不是阅读**你如何做事情,我可以阅读** **做了什么 - “反向”。所以,实际上你递减循环的for循环是复杂的(快速但复杂)。 –
我需要性能和便携性。我不在乎可读性。如果可能,应该避免使用纯c#。 – javapowered
这样的函数有多贵? – javapowered
@javapowered比for循环更昂贵。正常的'foreach'循环比'for for'花费更多,但差别非常小,我觉得更好看的代码是值得的。 – webnoob
尝试一下并找出;)Linq查询仅在需要时才被评估,因此,如果您仅使用前几项,我认为您不会真正遇到性能问题。 @webnoob,这听起来适合你吗? –