是否保证始终打印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
仅对其enqueue
和dequeue
操作提供保证。
我正在寻找一个引用文档的答案,这些文档可以保证.NET BCL中的这种排序。
答案 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()的循环一样