Collectionとは?
C#
のCollection
(コレクション)とは、複数の要素を管理、操作するためのデータ構造の総称です。
データの集まりを効率的に操作するための方法を提供して、要素の追加や削除などの操作をサポートします。
代表的なコレクションには以下に紹介するものがあります。
Array(配列)
Array
は固定サイズのコレクションです。配列と呼ばれることもあります。
以下の特徴があります。
- 初期化時にサイズが固定される
- 同じ型の要素を持つ
- 添え字によるアクセスが可能
初期化
要素数を指定して初期化します。
以下の場合、int
型で要素数10個分の配列になります。
int[] array = new int[10];
変更
要素を変更する場合、添え字でアクセスします。
array[2] = 111;
// 以下でも可
array.SetValue(5, 4);
コピー
配列の一部、または全ての要素を別の配列にコピーします。
int[] destinationArray = new int[10];
System.Array.Copy(array, destinationArray, 10);
サイズ変更
Array
について、サイズが固定されると説明しましたが、サイズを変更する方法もあります。
ただし新しい配列を用意して元の配列の要素をコピーする形になります。
System.Array.Resize(ref array, 20);
List(List)
List
は可変サイズのコレクションです。
以下の特徴があります。
- 動的にサイズが変わるため、後からデータを追加できる
- 同じ型の要素を持つ
- 添え字によるアクセスが可能
初期化
以下の場合、int型のリストが作成されます。
using System.Collections.Generic;
が必要です。
List<int> list = new List<int>();
値の取得
配列のように添え字でアクセス出来ます。
int value = list[0];
追加
値を最後尾に追加します。
list.Add(1);
削除
削除する方法は、値が一致するかと、添え字で指定するかの二種類があります。
// 先頭から見て値が1の要素を削除する
list.Remove(1);
// 先頭から2番目の要素を削除する
list.RemoveAt(2);
Removeは条件にあう要素一つしか削除できません。
全て削除したい場合は、RemoveAllを使用します。
// 値が1より大きい要素を全て削除
list.RemoveAll(value => value > 1);
挿入
Array
と違い、途中に挿入することも出来ます。
// 0番目に値1を挿入する
list.Insert(0, 1);
クリア
全ての要素を削除したい場合は以下の様にします。
list.Clear();
Dictionary(Dictionary<TKey, TValue>)
Dictionary
はキーと値をペアで管理するコレクションです。辞書とも呼ばれます。
以下の特徴があります。
- キーとペアで管理される
- キーを指定して値にアクセスする
初期化
キーと値の型を指定して、Dictionary
を作成します。
以下の場合、string
型のキーとint
型の値を持つDictionary
になります。
Dictionary<string, int> dictionary = new Dictionary<string, int>();
追加
キーと値を指定して追加します。
既に同じキーがある場合は例外が発生します。
dictionary.Add("Adam", 1);
値の取得
キーを指定して値を取得します。
キーが存在しない場合は例外が発生します。
int value = dictionary["Adam"];
安全な値の取得
TryGetValue
を使うと、指定したキーが存在する場合値を取得することが出来ます。
if (dictionary.TryGetValue("Adam", out int value))
{
// Adamに対応する値を取得できた
}
削除
キーを指定することで要素を削除できます。
dictionary.Remove("Adam");
クリア
要素を全て削除する場合は、Clear
を使用します。
dictionary.Clear();
キーがあるか
指定したキーが辞書にあるかどうか確認できます。
if (dictionary.ContainsKey("Adam"))
{
// Adamが存在する
}
値があるか
指定した値が辞書にあるかどうかも確認できます。
if (dictionary.ContainsValue(1))
{
// 1が存在する
}
それぞれの向き不向き
データをまとめて管理する、という点では同じですが、それぞれ向き不向きがあります。
Array
- 向いている
- 固定サイズのデータ、要素数が途中で変更されないもの
- 曜日、月など
- インデックスによる高速なアクセス
- 順序が決まっているデータ
- 固定サイズのデータ、要素数が途中で変更されないもの
- 向いていない
- 動的なサイズ変更
- 頻繁に追加、削除が行われる場合
- 複雑な操作
- 要素の挿入、削除、並べ替えなど
- 動的なサイズ変更
List
- 向いている
- 動的なサイズ変更
- 要素の追加、削除が発生する
- 柔軟な操作
- 要素の挿入、削除が容易
- インデックスによるアクセス
- 順序が決まっているデータ
- 動的なサイズ変更
- 向いていない
- キーによる検索
- 識別子によるデータの検索
- キーによる検索
Dictionary
- 向いている
- キーによる高速な検索
- データベースのようなキーと値のペアの管理
- キーとペアの管理
- 識別子による関連データの管理
- 柔軟なキー
- ユーザー名、ID、
enum
、オブジェクトなどをキーとして使用する場合
- ユーザー名、ID、
- キーによる高速な検索
- 向いていない
- 順序の維持
- 要素の順序が維持される必要がある場合
- 柔軟なキーの変更
- キーが頻繁に変更される場合
- 順序の維持
まとめ
C#
のコレクションである、Array
,List
,Dictionary
について解説しました。
前述の通り、それぞれに向き不向きがあります。
Array
はゲーム開始から変更されないようなものに使用するのが良いでしょう。
List
は使いどころが多く、出番は一番多いと思います。
Dictionary
はうまく使えばswitch
文を書く手間を省けるかもしれません。
それらを理解して適切に使用するのが重要です。
Collection
には他にもありますが、それらはまたの機会に解説したいと思います。