问题描述
|
如果Peek返回队列中的下一个对象,是否可以使用一种方法来获取特定对象?例如,我想在队列中找到第三个对象并更改其值之一?
现在,我只是在队列中进行遍历,这可能是最好的解决方案,但是我不知道peek是否可以使用某些特殊功能?即Queue.Peek(2)
解决方法
如果要直接访问元素(使用“ 0”操作),请使用数组而不是队列,因为队列具有不同的功能(FIFO)。
队列上的随机访问操作将为ѭ1,因为它需要遍历集合中的每个元素……这又使其成为顺序访问,而不是直接随机访问。
再一次,由于您使用的是C#,因此您可以从
System.Linq
中使用queue.ElementAt(n)
(因为Queue
实现IEnumerable
),但不会是O(1)
,即它将仍然遍历元素。
,尽管这仍然是O(n),但是如果您使用LINQ扩展方法ElementAt()
或ѭ8certainly,它们肯定更容易阅读,这些方法是Queue<T>
实现的IEnumerable<T>
扩展。
using System.Linq;
Queue<T> queue = new Queue<T>();
T result;
result = queue.ElementAt(2);
result = queue.ElementAtOrDefault(2);
编辑
如果确实有其他建议仅将队列转换为数组,则需要确定队列的可能大小以及从队列开始处要查找的索引的距离证明调用.ToArray()的O(n)操作的合理性。 ElementAt(m),更不用说为其创建辅助存储位置的空间要求。
,通过队列进行foreach。有点自相矛盾。
但是,如果可以foreach,则它是IEnumerable,因此通常使用linq扩展名:
queue.Skip(1).FirstOrDefault()
要么
queue.ElementAt(1)
,您可以一次性完成以下操作:
object thirdObjectInQueue = queue.ToArray()[2];
但是,我不建议您大量使用它,因为它将整个队列复制到一个数组中,从而无论如何都要遍历整个队列。