Queueて何?どうやって使うの?
Queue(キュー)とは、C# で扱えるコレクションの1つで、データを順番に処理するためのコレクションです。
このコレクションを使うと、最初に追加された要素が最初に取り出され、後から追加された要素は順番がきたら取り出されます。これは「先入れ先出し(First-In-First-Out=FIFO)」の原則に基づいています。
この記事では、C# のコレクションの1つである Queue の特徴と基本的な使用方法をサンプルコードを交えて紹介をしています。
ぜひ参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
Queueとは?
Queue(キュー)とは、C# で扱えるコレクションの1つで、データを順番に処理するためのコレクションです。
C# では、System.Collections.Generic
名前空間にQueue<T>
クラスが定義されています。ジェネリック型<T>
を使用することで、任意の型のオブジェクトをキューに格納できるため、柔軟に扱うことができます。
このコレクションを使うと、最初に追加された要素が最初に取り出され、後から追加された要素は順番がきたら取り出されます。これは「先入れ先出し(First-In-First-Out=FIFO)」の原則に基づいています。
古いデータから先に処理したい時や処理待ちのデータを一時的に蓄えておくのに適したコレクションです。
後入れ先出しをしたい場合はStack
クラスを使います。使い方は次の記事を参考にしてください。
Queueの使い方
ここから Queue<T> の使い方について紹介をします。
C# では Queue を扱うためのメソッドがいくつか用意されています。よく使用するメソッドは以下の通りです。
- Enqueueメソッド
Queue(キュー)の末尾にデータを追加します。 - Dequeueメソッド
Queue(キュー)の先頭からデータを取り出します。 - Peekメソッド
Queue(キュー)の先頭のデータを読み取ります。(要素は取り出りしません)
要素を追加する(Enqueue)
Queue に新しい要素を追加するには、Enqueue
メソッドを使用します。
このメソッドは、Queue の末尾に新しい要素を追加します。Enqueue
メソッドの引数に追加したい要素を渡します。
要素を追加する時、Queue に空きが無かった場合は自動で Queue のサイズが拡張されます。
次のサンプルコードは 1 ~ 7 までの整数をキューに追加し、その後、キューの要素をコンソールに表示します。
// 整数を格納するキュー
var queue = new Queue<int>();
// キューに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
queue.Enqueue(i);
}
// キューの要素を表示
foreach (int q in queue)
{
Console.WriteLine(q);
}
実行結果は次の通りです。
1
2
3
4
5
6
7
上記のサンプルコードではQueue<T>
クラスのインスタンスを生成し、for
文でループさせながらEnqueue
メソッドで要素をQueue(キュー)に追加します。
Queue(キュー)は FIFO の原理に従うため、最初に追加された要素である 1 が最初に表示されます。
要素を取り出す(Dequeue)
Queue から要素を取り出すには、Dequeue
メソッドを使用します。
このメソッドは、Queue の先頭にある要素、つまり最初に追加された要素を取り出します。要素を取り出すので、その要素は Queue から削除され、残りのデータは先頭に向かって1つずつ移動します。
次のサンプルコードは 1 ~ 7 までの整数をキューに追加し、その後、Dequeue
メソッドで最初に追加した要素を取り出します。
// 整数を格納するキュー
var queue = new Queue<int>();
// キューに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
queue.Enqueue(i);
}
// キューの要素を取り出し
var item = queue.Dequeue();
Console.WriteLine($"取り出した要素:{item}");
// キューの要素を表示
foreach (int q in queue)
{
Console.WriteLine(q);
}
実行結果は次の通りです。
取り出した要素:1
2
3
4
5
6
7
上記のサンプルコードではDequeue
メソッドで Queue の要素を取り出しています。foreach
文で Queue の要素を確認すると、取り出した要素が含まれていないことが分かります。
要素を取得する(Peek)
Queue から要素を削除せずに取得するには、Peek
メソッドを使用します。
このメソッドは、Queue の先頭にある要素を取得します。どの要素が次に取り出されるかを確認する際に便利なメソッドです。
Dequeue
メソッドと違う点は Queue の要素を削除しない点です。
次のサンプルコードは 1 ~ 7 までの整数をキューに追加し、その後、Peek
メソッドで最初に追加した要素を取得します。
// 整数を格納す// 整数を格納するキュー
var queue = new Queue<int>();
// キューに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
queue.Enqueue(i);
}
// 次取り出すことができる要素を取得する
var item = queue.Peek();
Console.WriteLine($"次に取り出す要素:{item}");
// キューの要素を表示
foreach (int q in queue)
{
Console.WriteLine(q);
}
実行結果は次の通りです。
次に取り出す要素:1
1
2
3
4
5
6
7
上記のサンプルコードではPeek
メソッドを呼び出して、Queue の先頭にある要素を取得しています。
Peek
メソッドは Queue から要素を削除しないので、foreach
文で Queue の要素を確認すると、取得した要素が含まれていることが分かります。
要素を全て削除する(Clear)
Queue から要素を全て削除するには、Clear
メソッドを使用します。
このメソッドは、Queue の中にある要素を全て削除するので、要素の数は 0 になります。
次のサンプルコードは 1 ~ 7 までの整数をキューに追加し、その後、Clear
メソッドで要素を削除します。
// 整数を格納す// 整数を格納するキュー
var queue = new Queue<int>();
// キューに1から7まで順に投入
for (int i = 1; i < 8; i++)
{
queue.Enqueue(i);
}
Console.WriteLine($"Clearメソッドを使う前の要素:{queue.Count}");
// キューの要素をすべて削除
queue.Clear();
Console.WriteLine($"Clearメソッドを使う後の要素:{queue.Count}");
実行結果は次の通りです。
Clearメソッドを使う前の要素:7
Clearメソッドを使う後の要素:0
Queue の要素数を確認するにはCount
メソッドを使います。
上記のサンプルコードではClear
メソッドを呼び出す前後で要素数がどのように変化しているかを確認しています。実行結果から分かるようにClear
メソッドを使用すると要素数が0になっています。
Clear
メソッドは Queue を再利用するために中身を全て破棄したい場合や、プログラムの特定の処理段階で Queue をリセットしたい場合に特に役立ちます。
まとめ
この記事では、C# で利用できるコレクションの1つである Queue の使い方について紹介しました。
最初に追加された要素が最初に取り出され、後から追加された要素は順番がきたら取り出される「先入れ先出し(First-In-First-Out=FIFO)」の原則に基づいているコレクションです。
- Enqueueメソッド
Queue(キュー)の末尾にデータを追加します。 - Dequeueメソッド
Queue(キュー)の先頭からデータを取り出します。 - Peekメソッド
Queue(キュー)の先頭のデータを読み取ります。(要素は取り出りしません)
Queue はデータを順番に処理する必要がある多くの場面で活躍できます。その際はぜひこの記事を参考にしてみてください。
以上、最後まで読んで頂きありがとうございました。