迭代队列<t>是否保证在队列顺序?</t>

时间:2013-08-26 19:36:41

标签: .net collections base-class-library

是否保证始终打印123

Queue<string> theQueue = new Queue<string>();
theQueue.Enqueue("1");
theQueue.Enqueue("2");
theQueue.Enqueue("3");
foreach(var str in theQueue)
{
    Console.Write(str);
}
Console.WriteLine();

修改 我完全同意以任何其他顺序枚举的队列显然是不正确的。这就是我问这个问题的原因。但是,抽象数据类型queue仅对其enqueuedequeue操作提供保证。

我正在寻找一个引用文档的答案,这些文档可以保证.NET BCL中的这种排序。

4 个答案:

答案 0 :(得分:3)

是。它是。队列是先进先出的集合,将按顺序枚举。

答案 1 :(得分:2)

文档证明:

是的,来自MSDN Documenation of GetEnumerator,emphisis mine

  

最初,枚举数位于集合中第一个元素之前。在这个位置,Current是未定义的。因此,在读取Current的值之前,必须调用MoveNext将枚举数推进到集合的第一个元素。

     

Current返回相同的对象,直到调用MoveNext。 MoveNext将Current设置为下一个元素。

但是,这并未解决集合中第一个元素的含义。要回答这个问题,我们需要转到description of Queue本身:

  

表示先进先出的对象集合。

结合上述两个语句,我们得到了官方代码合同,从枚举器返回的第一个对象将是第一个元素以及的事实>集合中的第一个元素将是 first-in 对象添加到集合,为我们提供最终输出,迭代Queue<T>将始终按顺序排列。< / p>


除此之外,将其与Dictionary进行比较,GetEnumerator()的定义说明了先检索第一个元素的相同行。但是Dictionary's description确实包含了集合中对象的显式排序:

  

表示键和值的集合。

这就是为什么Dictionary不能以插入顺序返回是“合法的”。

答案 2 :(得分:1)

是的,迭代Queue<T>保证在项目添加到它的顺序。这是FIFO队列的定义。来自MSDN docs

  

队列对于按照收到的顺序存储邮件非常有用   用于顺序处理。存储在队列中的对象将被插入   在一端并从另一端移除。

答案 3 :(得分:1)

以下是描述GetEnumerator for Queue的MSDN页面。总而言之(正如其他人所说的那样)你很高兴。 http://msdn.microsoft.com/en-us/library/4a9449ty.aspx

请注意,以这种方式枚举队列不会改变它的内容,就像调用Dequeue()的循环一样