どの言語でもあるように、C#でも複数のデータを扱う為の方法が存在します。これを "コレクション" と呼びます。
今回はコレクションについて述べていきます。
コレクション
コレクションにはいくつか種類があります。
どれも複数のデータを扱えるという点で同じではありますが、細かく使い方が違います。
コレクション | 特徴 |
---|---|
配列(Array) | 固定長。インデックスで要素にアクセスできる |
リスト(List) | 可変長。インデックスで要素にアクセスできる |
ディクショナリ(Dictionary) | 可変長。キーと値を紐づけてアクセスできる |
スタック(Stack) | 可変長。先入れ後出し(FILO)式 |
キュー(Queue) | 可変長。先入れ先出し(FIFO)式 |
これらについて一つずつ見ていきましょう
配列(Array)
最も基本的なコレクションです。
簡単に扱うことができますが、固定長なので必要なデータの要素数が最初から分かっている場合に使うことができます。
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 5;
arr[2] = 7;
C#ではコレクションのインデックス(要素番号)は0から始まるので、要素数3の配列を作成した場合、アクセスできるインデックスは0~2の3つになります。
また、要素外のインデックスにアクセスした場合、実行時エラーが発生します。
配列は次のように最初から要素を指定して初期化することも可能です。
int[] arr = new int[] { 3, 5, 7 };
リスト(List)
配列とは違い、リストは要素数が可変なのでAddメソッドを使うことで要素を追加していくことが可能です。
List<int> list = new List<int>();
list.Add(3);
list.Add(5);
ただし、リストにおいても要素外のインデックスへのアクセスは実行時エラーになります。
※言語によっては初期値で自動追加される場合もありますが、C#のリストはプログラマの想定外の挙動を抑制するためエラーとされています。
また、それを回避するためにある要素がリストに含まれているかどうかを判定するContainsメソッドも持っています。
List<int> list = new List<int>();
list.Add(3);
Console.WriteLine(list.Contains(3));
Console.WriteLine(list[0]);
Console.WriteLine(list.Contains(5));
> True
> 3
> False
ディクショナリ(Dictionary)
キーと値を紐づけた情報を複数持つことができます。他の言語ではハッシュマップなどとも呼ばれます。
ディクショナリは配列やリストの様な"何番目"という考え方ではなく追加された"キー"を基準に値にアクセスしていきます。
キーと値のペアはリストと同じくAddメソッドによる追加、ContainsKeyメソッドによるキーの確認ができます。
// Dictionary<キー型, 値型>
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(2, "Tokyo");
dic.Add(5, "Osaka");
Console.WriteLine(dic[5]);
Console.WriteLine(dic.ContainsKey(2));
Console.WriteLine(dic.ContainsKey(3));
> Osaka
> True
> False
追加されていない要素へアクセスしたり、既に追加されている要素と同じキーを再度追加しようとするとエラーが発生します。
追加されているかどうかの管理を厳密に行うことにより、キーの一意性を保つことができます。
スタック(Stack)とキュー(Queue)
スタックとキューに関しては対比しながら同時に紹介します。
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
> 3
> 2
> 1
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
> 1
> 2
> 3
上記の通り、スタックやキューは今までのコレクションとは違い、アクセスするときに番号やキーを指定しません。
Push/Enqueueメソッドで要素を追加し、Pop/Dequeueメソッドによって要素を取り出します。
注意しなければならないのはPop/Dequeueメソッドによって取り出した要素はスタックやキュー本体からも消えているということです。
また、スタックとキューで何が最も違うかと言えばその取り出す順番にあります。
スタックは一般にFILO(First In Last Out)方式であり、「最初に入れた要素が最後に出てくる」ことになります。
Popメソッドによって取り出されるのは、要素の中で一番最後にPushされたものです。
反対にキューは一般にFIFO(First In First Out)方式であり、「最初に入れた要素が最初に出てくる」ことになります。
Dequeueメソッドによって取り出されるのは、要素の中で一番最初にEnqueueされたものです。
IEnumerableという概念を知ってからだとコレクションについてのさらに詳しい内容を知ることができますが、このページではここまで。