C#のキューを使う

今回はC#のキュー(Queue)についてです。

キューは基本的なデータ構造の一つで先入れ先出しの構造でデータを保持します。
データを入れる操作をエンキュー、取り出す操作をデキューと言います。

C#ではQueueというクラスが用意されています。
stringのキューを使ってみます。

public void Test1()
{
    var queue = new Queue<string>();
    queue.Enqueue("a");
    queue.Enqueue("b");
    queue.Enqueue("c");
    queue.Enqueue("d");
    queue.Enqueue("e");
    queue.Enqueue("f");

    Console.WriteLine(queue.Count);
}

まずはインスタンスを生成しています。
stringのキューなので、Queueとしています。
数値であれば Queue などを指定します。

そしてEnqueueで文字列a~fまでをキューに入れています。
queue.Countでキューの要素数を取得できます。

次は要素を取り出してみます。

public void Test2()
{
    var queue = new Queue<string>();
    queue.Enqueue("a");
    queue.Enqueue("b");
    queue.Enqueue("c");
    queue.Enqueue("d");
    queue.Enqueue("e");
    queue.Enqueue("f");

    var str = queue.Dequeue();
    Console.WriteLine(str);
    Console.WriteLine(queue.Count);
}

Dequeueでキューから要素を取り出します。
キューは先入れ先出しなので、始めに入れた a が str に入ります。
そしてqueue.Countは一つ減って 5 となります。

queueに要素がない場合にDequeueすると例外が発生するので注意が必要です。

先頭の要素をキューから取り出さずに取得したい場合もあるかと思います。
そのような時はPeekを使用します。

public void Test3()
{
    var queue = new Queue<string>();
    queue.Enqueue("a");
    queue.Enqueue("b");
    queue.Enqueue("c");
    queue.Enqueue("d");
    queue.Enqueue("e");
    queue.Enqueue("f");

    var str = queue.Peek();
    Console.WriteLine(str);
    Console.WriteLine(queue.Count);

    str = queue.Dequeue();
    Console.WriteLine(str);
    Console.WriteLine(queue.Count);
}

Peekはキューの先頭要素を取得できますが、キューから除きません。
なのでqueue.Countは 6 のままで、
その後のDequeueでも同じ要素が取得できます。

他にも配列のメソッドを使用する場合も
キューから除かずに取得できます。

public void Test4()
{
    var queue = new Queue<string>();
    queue.Enqueue("a");
    queue.Enqueue("b");
    queue.Enqueue("c");
    queue.Enqueue("d");
    queue.Enqueue("e");
    queue.Enqueue("f");

    var array = queue.ToArray();
    Console.WriteLine(queue.Count);
}

ToArrayでキューの要素の配列を取得できますが、
queue.Countは 6 のままとなります。

queueはスレッド間のデータのやりとりなど、使う機会も多いと思いますのでぜひ覚えておきましょう。

スポンサーリンク