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、オブジェクトなどをキーとして使用する場合
  • 向いていない
    • 順序の維持
      • 要素の順序が維持される必要がある場合
    • 柔軟なキーの変更
      • キーが頻繁に変更される場合

まとめ

C#のコレクションである、Array,List,Dictionaryについて解説しました。

前述の通り、それぞれに向き不向きがあります。

Arrayはゲーム開始から変更されないようなものに使用するのが良いでしょう。

Listは使いどころが多く、出番は一番多いと思います。

Dictionaryはうまく使えばswitch文を書く手間を省けるかもしれません。

それらを理解して適切に使用するのが重要です。

Collectionには他にもありますが、それらはまたの機会に解説したいと思います。

🔗関連ページ