12

如果 Peek 返回队列中的下一个对象,是否有一种方法可以用来获取特定对象?例如,我想在队列中找到第三个对象并更改其中一个值?

现在我只是通过队列做一个f​​oreach,这可能是最好的解决方案,但我不知道是否有什么特别的东西可以用来偷看?即 Queue.Peek(2)

4

4 回答 4

20

如果要直接访问元素(通过O(1)操作),请使用数组而不是队列,因为队列具有不同的功能 (FIFO)。

队列上的随机访问操作将是O(n)因为它需要遍历集合中的每个元素......这反过来又使其成为顺序访问,而不是直接随机访问。


再说一次,由于您使用的是 C#,因此您可以使用queue.ElementAt(n)from System.Linq(since Queueimplements IEnumerable),但这不会是,O(1)即它仍然会遍历元素。

于 2011-05-26T13:13:40.600 回答
9

虽然这仍然是 O(n),但如果您使用 LINQ 扩展方法,它肯定更容易阅读,ElementAt()或者ElementAtOrDefault(),这些是 的扩展IEnumerable<T>,它Queue<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),更不用说为其创建辅助存储位置的空间要求。

于 2011-05-26T13:22:15.233 回答
4

foreach 通过队列。有点悖论。

但是,如果你可以 foreach,它是一个 IEnumerable,所以通常的 linq 扩展适用:

queue.Skip(1).FirstOrDefault()

或者

queue.ElementAt(1)
于 2011-05-26T13:14:56.887 回答
1

你可以一次性做这样的事情:

object thirdObjectInQueue = queue.ToArray()[2];

但是,我不建议大量使用它,因为它将整个队列复制到一个数组中,因此无论如何都要遍历整个队列。

于 2011-05-26T13:20:38.710 回答