はじめての 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))
{
// すでにある場合の処理
}
訪問数 3 回, 今日の訪問数 3回
ディスカッション
コメント一覧
まだ、コメントがありません