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は、その操作についてのみ保証しenqueueますdequeue

.NET BCL でこの順序を保証するドキュメントを参照する回答を探しています。

4

4 に答える 4

3

はい。です。キューは先入れ先出しコレクションであり、順番に列挙されます。

于 2013-08-26T19:38:20.693 に答える
2

文書証明:

はい、それはGetEnumerator のMSDNドキュメントから、強調私のものです

最初に、列挙子はコレクション内の最初の要素の前に配置されます。この位置では、Current は未定義です。したがって、Current の値を読み取る前に、MoveNext を呼び出して列挙子をコレクションの最初の要素に進める必要があります。

MoveNext が呼び出されるまで、Current は同じオブジェクトを返します。MoveNext は、Current を次の要素に設定します。

ただし、コレクションの最初の要素がどうなるかについては触れていません。それに答えるには、キュー自体の説明に行く必要があります。

オブジェクトの先入れ先出しコレクションを表します。

上記の 2 つのステートメントを組み合わせると、列挙子から返される最初のオブジェクトがコレクション内の最初の要素になるという公式のコード コントラクトがあり、コレクション内最初の要素がコレクションに追加される最初のオブジェクトになるという事実が得られます。 a の反復処理Queue<T>が常に適切であるという最終出力。


余談ですが、それを a と比較すると、GetEnumerator()Dictionaryの定義は、最初の要素を最初に取得することについて同じ行を示しています。ただし、ディクショナリの説明には、コレクション内のオブジェクトの明示的な順序が含まれています。

キーと値のコレクションを表します。

Dictionaryが広告掲載順で返されないことが「合法」であるのはそのためです。

于 2013-08-26T22:22:37.977 に答える
1

はい、Queue<T>アイテムが追加された順序であることが保証されています。これはFIFOキューの定義です。MSDN ドキュメントから:

キューは、順次処理のために受信した順序でメッセージを格納するのに役立ちます。Queue に格納されたオブジェクトは、一方の端に挿入され、もう一方の端から削除されます。

于 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 に答える