はじめての C# Dictionary —— まずは素直に書く、それから「TryGetValue」を知る

「名前から値をさっと引きたい」場面で使うのが Dictionary<TKey,TValue>。

ここでは最初はあえて TryGetValue を使わない基本形で始め、最後に「実務で便利な TryGetValue 版」も紹介します。


1. Dictionaryって何?

  • キー → 値 を対応づけて高速に検索・追加・削除できるコレクション。
  • 例:商品名 → 価格、ユーザーID → スコア、アイテムID → プレハブ参照(Unity)

2. まずは素直に:基本操作(TryGetValue なし)

作成・初期化・追加

var prices = new Dictionary<string, int>();
prices.Add("にんじん", 100);  // 既にあれば例外
prices["だいこん"] = 200;     // 既にあれば上書き、なければ追加

取り出し(存在チェックしてから取り出す)

if (prices.ContainsKey("にんじん"))
{
    int p = prices["にんじん"];
    Console.WriteLine(p);
}
else
{
    Console.WriteLine("未登録です");
}

メモ:prices[“未登録キー"] は KeyNotFoundException になるので、最初は ContainsKey とセットで覚えると安全です。

上書き(更新)

// 例:「じゃがいも」を180円に設定(なければ追加、あれば上書き)
prices["じゃがいも"] = 180;

削除・全件列挙

prices.Remove("だいこん"); // 見つからなければ false

foreach (var pair in prices)
{
    Console.WriteLine($"{pair.Key} : {pair.Value}円");
}

3. 動くミニアプリ(コンソール、TryGetValue なし)

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var prices = new Dictionary<string, int>
        {
            ["にんじん"] = 100,
            ["だいこん"] = 200,
            ["たまねぎ"] = 150
        };

        Console.WriteLine("商品名を入力(空Enterで終了)");
        int total = 0;

        while (true)
        {
            Console.Write("> ");
            var name = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(name)) break;

            if (prices.ContainsKey(name))
            {
                total += prices[name];
                Console.WriteLine($"{name} を追加:合計 {total} 円");
            }
            else
            {
                Console.WriteLine("未登録の商品です。");
            }
        }

        Console.WriteLine($"最終合計:{total} 円");
    }
}

4. ここで一歩進む:TryGetValue という書き方もある

上のように ContainsKey → dict[key] と2回アクセスする代わりに、

一度で存在確認+取り出しができるのが TryGetValue です。

書き方の比較

従来(最初に覚える形)

if (dict.ContainsKey(key))
{
    var value = dict[key];
    // 使う
}
else
{
    // ないとき
}

TryGetValue 版(実務でよく使う)

if (dict.TryGetValue(key, out var value))
{
    // value を使う(見つかった)
}
else
{
    // ないとき
}

もう一歩だけ実例(頻度カウント)

従来版

if (counts.ContainsKey(word))
    counts[word] = counts[word] + 1;
else
    counts[word] = 1;

TryGetValue 版

counts[word] = counts.TryGetValue(word, out var c) ? c + 1 : 1;

ポイント

  • TryGetValue は1回の呼び出しで「ある?」と「取り出し」を同時に行える。
  • 例外を気にせず読み取りが簡潔に書けるため、慣れたらこちらが定番

5. 使い分けの目安(結論)

  • 最初は:ContainsKey → dict[key] でOK(挙動が直感的で学びやすい)
  • 慣れてきたら:読み取りは TryGetValue を基本形にする(簡潔・効率的)

6. 小さな発展(必要になったら)

  • 文字列の大文字小文字を区別したくないとき:
var dict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
  • 追加時のみ失敗を知りたいとき(既存なら false):
if (!dict.TryAdd("key", 123))
{
    // すでにある場合の処理
}

訪問数 4 回, 今日の訪問数 4回

C#

Posted by hidepon