前回は、まとまりの中身を全部取り出す 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)がひととおり揃いました。
次回からは、処理をひとまとめにする メソッド に進みます。