C#入門⑭ Dictionary ── 名前をつけて、データを引く
前回は、まとまりの中身を全部取り出す foreach をやりました。
今回は、データのまとまりの最後。名前をつけてデータを引けるDictionary(ディクショナリ)です。
Dictionary とは、「名前」と「中身」をペアで覚えておくまとまりです。
番号で引くのが、不便なとき
配列やListは、中身を番号(0,1,2…)で取り出していました。
int[] scores = { 80, 95, 70 };
Console.WriteLine(scores[1]); // 95(1番目)
でも、これだと「scores[1] って、誰の点数だっけ?」と分からなくなります。番号と中身の対応を、自分で覚えておかないといけません。
もし「山田さんの点数」のように、名前で引けたら便利ですよね。
"山田" → 80
"田中" → 95
"佐藤" → 70
これを実現するのが Dictionary です。名前のとおり「辞書」。言葉(名前)を引くと、その意味(中身)が出てくる、まさに辞書のような仕組みです。
書き方を見てみる
名前と点数のペアを、Dictionary で持ってみます。
Dictionary<string, int> scores = new Dictionary<string, int>();
scores.Add("山田", 80);
scores.Add("田中", 95);
scores.Add("佐藤", 70);
記号が少し多いですが、ひとつずつ見れば大丈夫です。
Dictionary<string, int>… 「文字列の名前」で「整数の中身」を引く、という意味< >の中が、左が名前の型、右が中身の型
new Dictionary<string, int>()… 空っぽの Dictionary を用意scores.Add("山田", 80)… 「山田」という名前に、80 を結びつける
Add で「名前」と「中身」をペアで追加していきます。
名前で引いてみる
取り出すときは、番号ではなく名前を使います。
Console.WriteLine(scores["山田"]); // 80
Console.WriteLine(scores["田中"]); // 95
scores["山田"] で、「山田さんの点数」がすぐ取り出せます。番号を覚える必要はありません。「誰の点数か」が、コードを見ただけで分かります。
配列の scores[1](誰?)と、Dictionary の scores["山田"](山田さん!)。この分かりやすさが、Dictionary の強みです。
配列・List と、どう使い分けるか
ここが大事なところです。
- 配列・List … 中身を 順番(番号) で管理する。「○番目」で扱う
- Dictionary … 中身を 名前 で管理する。「○○の値」で扱う
たとえば、
- 「来た順に並んだ待ち行列」→ 順番が大事なので List
- 「社員番号から、名前を引く」→ 名前で引きたいので Dictionary
- 「商品コードから、値段を引く」→ Dictionary
「番号で十分か、名前で引きたいか」。これが使い分けの判断軸です。
つまずきポイント
初心者がはまるのが、存在しない名前で引くことです。
Dictionary<string, int> scores = new Dictionary<string, int>();
scores.Add("山田", 80);
Console.WriteLine(scores["田中"]); // 「田中」は登録していない!エラー
登録していない名前で引こうとすると、エラーになります。配列で「無い番号」を指定したときと同じですね(第11回)。
引く前に「その名前、ちゃんと登録したかな?」を確認する。あるか分からないときは、ContainsKey で先に確かめる方法もあります。
if (scores.ContainsKey("田中"))
{
Console.WriteLine(scores["田中"]);
}
「田中という名前があれば、引く」。これなら安全です。
まとめ
Dictionary は、名前と中身をペアで持つまとまり。
Dictionary<string, int> scores = new Dictionary<string, int>();
scores.Add("山田", 80);
Console.WriteLine(scores["山田"]); // 名前で引く
- 番号ではなく 名前 で取り出せる
- 順番で扱うなら配列・List、名前で引くなら Dictionary
- 無い名前で引くとエラー。
ContainsKeyで確認できる
これで、データのまとまり(配列・List・foreach・Dictionary)がひととおり揃いました。
次回からは、処理をひとまとめにする メソッド に進みます。

