C#コレクション入門|List・Dictionary・配列の違いと使い分けを初心者向けに解説

はじめに

C#で複数のデータをまとめて扱うときに欠かせないのが「コレクション」です。たとえば、ユーザー名の一覧、商品の価格、テスト結果などを1つずつ別の変数に保存すると、データが増えるほど管理が難しくなります。

そこで利用するのが、配列やList<T>Dictionary<TKey, TValue>といった仕組みです。これらは複数の値をまとめて保存できますが、データの追加方法や検索方法、適した用途が異なります。

この記事では、C#のコレクションについて、配列・List・Dictionaryの違いと使い分けを初心者向けに解説します。

1. C#のコレクションとは

C#のコレクションとは、複数のデータをひとまとめにして管理するための仕組みです。

たとえば、3人分の名前を通常の変数で管理する場合は、次のように複数の変数を用意する必要があります。

C#
string name1 = "田中";
string name2 = "佐藤";
string name3 = "鈴木";

人数が少ないうちは問題ありませんが、100人、1,000人と増えていくと管理が困難です。コレクションを使用すれば、複数の名前を1つの変数にまとめられます。

C#
string[] names = { "田中", "佐藤", "鈴木" };

C#にはさまざまなコレクションがありますが、初心者が最初に覚えておきたいのは次の3つです。

  • 配列:決まった数のデータを順番に管理する

  • List<T>:データを自由に追加・削除する

  • Dictionary<TKey, TValue>:キーと値を組み合わせて管理する

配列とは

配列は、同じ型のデータを決められた数だけ保存する仕組みです。

C#
int[] scores = new int[3];

scores[0] = 80;
scores[1] = 90;
scores[2] = 75;

配列の各要素には、インデックスと呼ばれる番号を使ってアクセスします。インデックスは0から始まるため、最初の要素はscores[0]です。

配列は、初期値を指定して作成することもできます。

C#
int[] scores = { 80, 90, 75 };

Console.WriteLine(scores[0]);

配列の要素数は、Lengthプロパティで取得できます。

C#
Console.WriteLine(scores.Length);

配列の特徴は、作成したあとに要素数を変更できないことです。

C#
int[] scores = new int[3];

この配列には3個の要素しか保存できません。あとから4個目の要素を追加したい場合は、より大きな配列を新しく作成する必要があります。

そのため、配列は次のような場面に向いています。

  • 曜日のように要素数が決まっている

  • 座標やRGB値など、固定数のデータを扱う

  • データをあとから追加・削除しない

Listとは

List<T>は、要素をあとから追加・削除できるコレクションです。要素数が変化するデータを扱う場合は、配列よりもList<T>が適しています。

List<T>を使用するには、一般的に次の名前空間を利用します。

C#
using System.Collections.Generic;

文字列を保存するListは、次のように作成します。

C#
List<string> names = new List<string>();

List<string>stringは、Listに保存するデータの型を表しています。整数を保存する場合はList<int>、小数を保存する場合はList<double>と記述します。

要素を追加するには、Addメソッドを使用します。

C#
List<string> names = new List<string>();

names.Add("田中");
names.Add("佐藤");
names.Add("鈴木");

最初から要素を指定して作成することもできます。

C#
List<string> names = new List<string>
{
"田中",
"佐藤",
"鈴木"
};

Listの要素には、配列と同じようにインデックスでアクセスできます。

C#
Console.WriteLine(names[0]);

要素を削除するときは、Removeメソッドを使用します。

C#
names.Remove("佐藤");

指定した位置の要素を削除する場合は、RemoveAtメソッドを使用します。

C#
names.RemoveAt(0);

Listに保存されている要素数は、Countプロパティで取得できます。

C#
Console.WriteLine(names.Count);

配列では要素数の取得にLengthを使いますが、ListではCountを使う点に注意しましょう。

Listは次のような場面に向いています。

  • ユーザーが入力したデータを順番に保存する

  • 商品やタスクの一覧を管理する

  • 要素をあとから追加・削除する

  • 保存するデータ数が事前に決まっていない

Dictionaryとは

Dictionary<TKey, TValue>は、キーと値をセットで保存するコレクションです。

たとえば、商品名と価格を関連付けて保存する場合に適しています。

C#
Dictionary<string, int> prices = new Dictionary<string, int>();

prices.Add("りんご", 150);
prices.Add("みかん", 120);
prices.Add("バナナ", 200);

Dictionary<string, int>では、キーの型がstring、値の型がintです。

要素を取得するときは、インデックス番号ではなくキーを指定します。

C#
Console.WriteLine(prices["りんご"]);

実行結果は次のとおりです。

150

Dictionaryは、初期値を指定して作成することもできます。

C#
Dictionary<string, int> prices = new Dictionary<string, int>
{
{ "りんご", 150 },
{ "みかん", 120 },
{ "バナナ", 200 }
};

キーを指定して値を変更することも可能です。

C#
prices["りんご"] = 180;

要素を削除する場合は、Removeメソッドにキーを指定します。

C#
prices.Remove("みかん");

Dictionaryでは、同じキーを重複して登録できません。すでに存在するキーをAddメソッドで追加すると、例外が発生します。

また、存在しないキーを指定して値を取得した場合も例外が発生します。

C#
Console.WriteLine(prices["ぶどう"]);

安全に値を取得するには、TryGetValueメソッドが便利です。

C#
if (prices.TryGetValue("りんご", out int price))
{
Console.WriteLine($"価格は{price}円です");
}
else
{
Console.WriteLine("商品が見つかりません");
}

Dictionaryは次のような場面に向いています。

  • 商品名と価格を管理する

  • ユーザーIDとユーザー情報を関連付ける

  • 都道府県名と県庁所在地を管理する

  • 名前やIDを使ってデータを検索する

配列・List・Dictionaryの違い

配列とListは、どちらもデータを順番に保存し、インデックスを使って要素を取得します。

C#
string[] array = { "A", "B", "C" };
List<string> list = new List<string> { "A", "B", "C" };

Console.WriteLine(array[0]);
Console.WriteLine(list[0]);

大きな違いは、要素数を変更できるかどうかです。

配列は作成時に要素数が固定されます。一方、ListはAddRemoveを使って要素を追加・削除できます。そのため、データ数が変化する場合はListのほうが扱いやすいでしょう。

Dictionaryは、配列やListとはデータの管理方法が異なります。インデックスではなく、任意のキーを使って値を取得します。

C#
Dictionary<string, string> capitals = new Dictionary<string, string>
{
{ "東京都", "新宿区" },
{ "大阪府", "大阪市" },
{ "北海道", "札幌市" }
};

Console.WriteLine(capitals["北海道"]);

それぞれの主な違いは次のとおりです。

種類データの取得方法要素数の変更主な用途
配列インデックス不可固定数のデータ
Listインデックス可能増減するデータの一覧
Dictionaryキー可能キーと値の組み合わせ

配列・List・Dictionaryの使い分け

どのコレクションを選ぶか迷った場合は、データ数と取得方法に注目すると判断しやすくなります。

データ数が決まっており、あとから追加や削除をしない場合は配列が適しています。

C#
string[] days =
{
"月曜日",
"火曜日",
"水曜日",
"木曜日",
"金曜日",
"土曜日",
"日曜日"
};

データ数が変わる場合や、要素を頻繁に追加・削除する場合はListが便利です。

C#
List<string> tasks = new List<string>();

tasks.Add("メールを確認する");
tasks.Add("資料を作成する");
tasks.Remove("メールを確認する");

名前やIDなどを使って、対応する値を取得したい場合はDictionaryを選びます。

C#
Dictionary<int, string> users = new Dictionary<int, string>
{
{ 1001, "田中" },
{ 1002, "佐藤" },
{ 1003, "鈴木" }
};

Console.WriteLine(users[1002]);

判断基準を簡単に整理すると、次のようになります。

  • 要素数が固定されているなら配列

  • 要素数が変化するならList

  • キーから値を検索したいならDictionary

foreach文でコレクションを繰り返し処理する

コレクションに保存されたすべての要素を順番に処理する場合は、foreach文が便利です。

配列を繰り返し処理する例は次のとおりです。

C#
string[] names = { "田中", "佐藤", "鈴木" };

foreach (string name in names)
{
Console.WriteLine(name);
}

Listも同じように処理できます。

C#
List<int> scores = new List<int> { 80, 90, 75 };

foreach (int score in scores)
{
Console.WriteLine(score);
}

Dictionaryをforeach文で処理すると、キーと値の両方を取得できます。

C#
Dictionary<string, int> prices = new Dictionary<string, int>
{
{ "りんご", 150 },
{ "みかん", 120 },
{ "バナナ", 200 }
};

foreach (KeyValuePair<string, int> item in prices)
{
Console.WriteLine($"{item.Key}は{item.Value}円です");
}

現在のC#では、次のようにキーと値を分けて受け取る書き方もできます。

C#
foreach (var (name, price) in prices)
{
Console.WriteLine($"{name}は{price}円です");
}

コレクションの全要素を確認したい場合は、まずforeach文を使うと覚えておくとよいでしょう。

まとめ

C#のコレクションは、複数のデータをまとめて管理するための仕組みです。代表的なものとして、配列・List<T>Dictionary<TKey, TValue>があります。

配列は要素数が固定されているデータに適しています。Listは要素を自由に追加・削除できるため、データ数が変化する一覧の管理に便利です。Dictionaryはキーと値をセットで保存でき、名前やIDから対応するデータを取得したい場合に役立ちます。

最初からすべてのコレクションを覚える必要はありません。まずは「固定数なら配列」「増減する一覧ならList」「キーから検索するならDictionary」という3つの基準を押さえ、実際にコードを書きながら使い分けを身につけましょう。