ここでは非ジェネリックなコレクション型System.Collections.Queueクラスについて解説します。 Queueクラスを使用するよりも、Queueに相当するジェネリックなコレクション型System.Collections.Generic.Queue<T>クラスを使用することを強く推奨します。
Queue
System.Collections.Queueクラスは、先入れ先出し(FIFO: First-In, First-Out)のデータ構造を持つキューを提供するコレクションクラスです。 Queueクラスでは、ArrayListクラスやHashtableクラスとは異なり、コレクションにどのようなオブジェクトが格納されているかということより、どのような順番で格納されたかと言うことの方が重要視されます。
基本的な操作
.NET FrameworkにおけるQueueクラスの概要を見ていきます。 Queueに要素を追加するエンキューの操作はEnqueueメソッド、Queueから要素を取り出すデキューの操作はDequeueメソッドで行います。 Queueから要素をデキューすると、取り出した要素はQueueから削除されます。 待ち行列の最後尾に一人並べる作業がエンキュー、待ち行列の先頭から一人引き抜く作業がデキューに相当するとイメージするとよいと思います。
また、Peekメソッドを使うと、Queueの内容はそのままで(削除されずに)先頭にある要素を取得できます。 Queueの内容が空の場合に、DequeueメソッドやPeekメソッドを呼び出すとInvalidOperationExceptionがスローされます。 Queueの内容を空にするには、Clearメソッドを使います。 Queueに指定した内容の要素が含まれているか調べるには、Containsメソッドを使います。
Queueに現在いくつの要素が含まれているかを知るにはCountプロパティを参照します。 ArrayListなどと同様、Queueには任意の数の要素をエンキューできます。 Queue内部の容量はエンキューの際に自動的に拡充されます。 デキューの際に要素数が減っても、Queue内部で確保されている容量は減ることはありません。
一番最初にQueueに入れた要素は一番始めに取り出されるという特性上、要素を入れた順番と同じ順番で表示されている点に注目してください。
列挙操作
Queueでも、foreach文による列挙ができるようになっていますが、インデクサはサポートされないのでfor文による列挙は出来ません。 foreach文による列挙を行う場合は、Dequeueしたときと同じ順で列挙されますが、当然要素の削除は行われません。
配列からの変換
配列からQueueに変換するには、コンストラクタが使えます。 コンストラクタに配列を指定した場合、Queueの内容は配列の要素を先頭から一つずつEnqueueした場合と同じ内容になります。
配列への変換・コピー
Queueから配列へ変換する場合にはToArrayメソッドやCopyToメソッドが使えますが、ArrayListから配列の変換の場合とは異なり、object型の配列への変換しかサポートされていません。 変換・コピーした後の配列の内容は、Queueの内容を一つずつDequeueした場合と同じ内容になります。 また、変換・コピーの前後でQueueの内容は変化しません。