C#ライブラリリファレンス - 先入れ先出し法でデータを管理する
キュージェネリックオブジェクトを使用すれば、複数のインスタンス(データ)を先入れ先出し法で格納管理できます。
日常でたとえると
お客様、並んでください。整理券を配ります
使用に適した状況
インスタンス(データ)の格納する順番に重要な意味がある場合。
サンプル
/*----------------------------------------------------
*
* キューにより先入れ先出し法でデータを管理する。
*
----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
class Sample
{
static void Main()
{
//キューを用意
var datas = new Queue<int>();
//キューにデータを追加
Console.WriteLine(
"***** キューにデータを入れます *****" );
Action<int> Add = ( int value ) => {
datas.Enqueue( value );
Console.Write( " 追加した数:{0}",
value );
};
ProcessPrint(
datas,
Add );
//キューからデータを取り出す
Console.WriteLine(
"***** キューからデータを取り出します *****" );
Action<int> Get = ( int i ) => {
int value = datas.Dequeue();
Console.Write( " 取り出した数:{0}",
value );
};
ProcessPrint(
datas,
Get );
}
//追加または取り出すときの様子を表示する。
private static void ProcessPrint(
Queue<int> datas, Action<int> process )
{
for ( int i = 0 ; i < 10 ; ++i ) {
Console.Write( "処理前の個数:{0}",
datas.Count );
//空の時Peekを呼び出すと例外が発生
Console.Write( " 先頭の数:{0}",
datas.Count != 0 ?
datas.Peek().ToString() :
"0" );
process( i );
Console.Write( " 処理後の個数:{0}",
datas.Count );
Console.WriteLine();
}
Console.WriteLine();
}
}
名前空間
System.Collections.Generic名前空間を参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。
解説
プログラミングでは、データ(オブジェクトのインスタンス)をただ集めればいいというものではなく、格納した順番が重要な意味を持つ場合があります。リストジェネリックオブジェクトでもデータを格納できますが、誰かが整列してしまうかもしれませんし、プログラマに対して入れた順番に取り出すのが重要であることを明示しなくてはなりません。
データを入れた順番通りに取り出して処理をしたい場合、Queueジェネリックオブジェクトを使用します。このオブジェクトは、Enqueue(エンキュー)メソッドでデータを入れ、Dequeue(デキュー)メソッドで先入れ先出し法にてデータを取り出します。
取り出したデータは消えてしまうので、先頭のデータを調べたい時は、Peekメソッドでキューの中を覗きます。ただし、空の時に覗くと怒られる(例外が発生する)ので注意しましょう。