C# 选择队列中的特定对象(即peek+;1)
如果Peek返回队列中的下一个对象,是否有一种方法可用于获取特定对象?例如,我想找到队列中的第三个对象并更改其一个值C# 选择队列中的特定对象(即peek+;1),c#,queue,peek,C#,Queue,Peek,如果Peek返回队列中的下一个对象,是否有一种方法可用于获取特定对象?例如,我想找到队列中的第三个对象并更改其一个值 现在我只是在队列中做一个foreach,这可能是最好的解决方案,但我不知道你是否可以用peek来做一些特别的事情?ie Queue.Peek(2)如果要直接访问元素(使用O(1)操作),请使用数组而不是队列,因为队列具有不同的功能(FIFO) 队列上的随机访问操作将是O(n),因为它需要迭代集合中的每个元素……这反过来使其成为顺序访问,而不是直接随机访问 然后,由于您使用的是C
现在我只是在队列中做一个foreach,这可能是最好的解决方案,但我不知道你是否可以用peek来做一些特别的事情?ie Queue.Peek(2)如果要直接访问元素(使用
O(1)
操作),请使用数组而不是队列,因为队列具有不同的功能(FIFO)
队列上的随机访问操作将是O(n)
,因为它需要迭代集合中的每个元素……这反过来使其成为顺序访问,而不是直接随机访问
然后,由于您使用的是C#,因此可以使用
System.Linq
中的queue.ElementAt(n)
(因为queue
实现了IEnumerable
),但这不会是O(1)
,也就是说,它仍然会在元素上迭代。通过队列进行访问。有点自相矛盾
但是,如果可以foreach,它是一个IEnumerable,因此通常使用linq扩展:
queue.Skip(1).FirstOrDefault()
或
你可以一次性做这样的事情:
object thirdObjectInQueue = queue.ToArray()[2];
但是,我不建议经常使用它,因为它会将整个队列复制到一个数组中,从而在整个队列上进行迭代。尽管这仍然是O(n),但如果使用LINQ扩展方法ElementAt()
或elementatordedfault()
,阅读起来肯定会更容易,这些是IEnumerable
的扩展,由Queue
实现
using System.Linq;
Queue<T> queue = new Queue<T>();
T result;
result = queue.ElementAt(2);
result = queue.ElementAtOrDefault(2);
使用System.Linq;
队列=新队列();
T结果;
结果=queue.ElementAt(2);
结果=queue.ElementAtOrDefault(2);
编辑
如果您同意将队列转换为数组的其他建议(仅用于此操作),则需要确定队列的可能大小以及从队列开始查找的索引距离是否证明调用.ToArray()的O(n)操作是正确的。ElementAt(m),更不用说为其创建辅助存储位置的空间要求了 @Andreas:说得好,我刚刚使用object作为示例,编辑后使用通用参数。访问使用循环缓冲区实现的队列中的随机元素,如
queue
,是一个O(1)
操作Queue
甚至有一个GetElement(int)
方法可以实现这一点,但不幸的是,它被标记为internal
。当然,可以实现自己的队列类来允许随机访问,或者使用具有O(1)
排队、出队和项目随机访问(甚至推送和弹出)的类。这只适用于内置队列类。NET队列类不公开索引器,但显然可以计算第n项的索引<代码>函数peek(n){return _buffer[(currentIndex+n)%_buffer.length];一个不同的实现可以很容易地提供此功能。如果必须获得多个元素,此函数尤其有用。这是一个糟糕的想法,但因为您认识到我不会否决投票
using System.Linq;
Queue<T> queue = new Queue<T>();
T result;
result = queue.ElementAt(2);
result = queue.ElementAtOrDefault(2);