2013-08-26 35 views
3

這是保證總是打印123迭代隊列<T>保證按隊列順序?

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中的這種排序。

+6

我想大多數人都沒有注意到你的問題。隊列由推送和彈出如何工作定義。在此方法中迭代沒有在隊列的正常定義中定義 – bengoesboom

+0

@bengoesboom [是它已定義](http://msdn.microsoft.com/zh-cn/library/4a9449ty.aspx),「隊列 .GetEnumerator ()'有它自己的MSDN頁面,其中包含示例代碼,該代碼聲明'foreach'調用使用的'IEnumerable'將與'Peek()'和'Pop()'行爲相同。 –

+0

您是否閱讀過'Queue '的MSDN頁面?似乎對我有很好的參考價值(隊列 b =新隊列(a)'function?)。 – user7116

回答

3

是的。它是。隊列是先入先出的集合,將按順序枚舉。

+2

這對我來說看起來很直觀,但是有沒有任何文件可以支持你? –

+1

Plenty:http://msdn.microsoft.com/en-us/library/System.Collections.Queue.aspx –

+1

The [隊列 .GetEnumerator()](http://msdn.microsoft.com/en-us /library/4a9449ty.aspx)頁面有更好的示例代碼。 –

1

是的,迭代一個Queue<T>保證在項目添加到它的順序。這是一個FIFO隊列的定義。來自MSDN docs

隊列對於以順序處理收到的順序存儲消息的順序很有用 。存儲在隊列中的對象在一端插入 ,並從另一端刪除。

1

以下是描述GetEnumerator for Queue的MSDN頁面。總之(正如其他人所說的),你很好走。 http://msdn.microsoft.com/en-us/library/4a9449ty.aspx

注意,枚舉隊列這種方式並沒有改變它的內容是遍歷它調用出列的方式()將

2

文件證明:

是的,從MSDN Documenation of GetEnumerator,emphisis我的

最初,枚舉器位於集合中的第一個元素之前。在這個位置,電流是不確定的。因此,在讀取當前值之前,必須調用MoveNext將枚舉數前移到集合的第一個元素。

當前返回相同的對象,直到調用MoveNext。 MoveNext將當前設置爲下一個元素。

但是這並沒有解決集合中的第一個元素將是什麼。要回答我們需要去description of Queue本身:

表示先進先出的對象集合。

結合,我們有的第一個對象從枚舉器返回的將是集合第一要素和事實集合中的第一個元素將是官方代碼合同上面兩個語句首先在對象添加到集合給我們我們的最終輸出,在Queue<T>將迭代總是按順序。


順便說一句,比較,爲一個Dictionary,定義爲GetEnumerator()狀態繞第一檢索第一元件的同一行上。但Dictionary's description確實包含集合中對象的顯式排序:

表示鍵和值的集合。

這就是爲什麼Dictionary不按照插入順序返回是「合法」的原因。

+1

[Dictionary ](http://msdn.microsoft.com/en-us/library/9c6ftx8b.aspx)的文檔說完全相同的事情,並且它已被顯示,您不能指望枚舉項目中的字典他們添加的順序。我將授予'Queue '的實現按照人們的預期工作(即按刪除順序進行迭代),但我認爲行爲只是一個實現細節:合同中沒有任何內容表示它必須這樣做。 –

+0

@JimMischel我已經更新了我的回答,包含了我以前的(刪除的)評論。如果您仍然覺得文檔沒有指定代碼合同,請告訴我我錯過了什麼。 –

+0

我理解你的推理,我認爲它可能(正如我一直),他們實際上意味着指定代碼合同的文檔。在我看來,文檔留下了一些迴旋餘地。我認爲它應該明確指出項目是在刪除順序中迭代的。但這是我應該和文檔團隊討論的問題。 –