3

这保证总是打印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

4 回答 4

3

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

于 2013-08-26T19:38:20.693 回答
2

文件证明:

是的,来自GetEnumerator 的 MSDN 文档,重点是我的

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

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

但是,这并没有解决集合中的第一个元素是什么。要回答这个问题,我们需要转到Queue本身的描述:

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

结合上面的两个语句,我们有官方代码约定,从 Enumerator 返回的第一个对象将是集合中的第一个元素,而集合中的第一个元素将是添加到集合中的第一个对象,这给了我们我们迭代 a 的最终输出Queue<T>总是有序的。


顺便说一句,将其与 a 进行比较,GetEnumerator()Dictionary的定义声明了关于首先检索第一个元素的同一行。但是Dictionary 的描述确实包括集合中对象的显式排序:

表示键和值的集合。

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

于 2013-08-26T22:22:37.977 回答
1

是的,对 a 的迭代Queue<T>保证按照添加到其中的项目的顺序进行。这是FIFO队列的定义。从MSDN 文档

队列对于按接收顺序存储消息以进行顺序处理很有用。存储在队列中的对象在一端插入并从另一端移除。

于 2013-08-26T19:39:33.790 回答
1

这是描述队列的 GetEnumerator 的 MSDN 页面。总之(正如其他人所说)你很高兴。 http://msdn.microsoft.com/en-us/library/4a9449ty.aspx

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

于 2013-08-26T19:40:27.857 回答