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はAddやRemoveを使って要素を追加・削除できます。そのため、データ数が変化する場合は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つの基準を押さえ、実際にコードを書きながら使い分けを身につけましょう。

