3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DictionaryとLookUpの使い分け

Last updated at Posted at 2025-09-28

DictionaryとLookUpの違い

どちらもキーによるデータの管理という役割は同じですが、用途や性質が異なります。

主な違いはKeyに対する値が単一か(Dictionary)、複数か(LookUp)です。
イメージはこんな感じ。

image.png

Dictionary

  • 同じキーに紐づく値は基本的に一つ(Listなどコレクション型を値にすれば複数も可)
  • 値の追加・削除・更新が自由
  • CRUD(作成・読み込み・更新・削除)が中心となる管理や高速アクセスが必要な場面に適している

実装例

// Dictionaryを作成
// ユーザーIDと年齢の組み合わせ
var userAges = new Dictionary<string, int>
{
    ["user1"] = 25,
    ["user2"] = 30,
    ["user3"] = 28
};

// 基本的なアクセス方法
foreach (var keyValuePair in userAges)
{
    Console.WriteLine($"  {keyValuePair.Key}{keyValuePair.Value}歳");
}

// 出力結果
// user1 → 25歳
// user2 → 30歳
// user3 → 28歳 

// 指定のキーからアクセス
int user2Age = userAges["user2"];
Console.WriteLine($"user2の年齢: {user2Age}歳");

// 出力結果
// user2の年齢: 30歳

// 要素の追加・更新(変更可能)
userAges["user4"] = 35;  // 新しい要素を追加
userAges["user1"] = 26;  // 既存の要素を更新

foreach (var keyValuePair in userAges)
{
    Console.WriteLine($"  {keyValuePair.Key}{keyValuePair.Value}歳");
}

// 出力結果
// user1 → 26歳
// user2 → 30歳
// user3 → 28歳
// user4 → 35歳

// 安全な取得方法
// TryGetValueを使えば存在しないキーを指定しても例外が発生しない
if (userAges.TryGetValue("user5", out int age))
{
    Console.WriteLine($"user5の年齢: {age}歳");
}
else
{
    Console.WriteLine("user5は存在しません");
}

// 出力結果
// user5は存在しません

LookUp

  • キーごとに「複数の値(IEnumerable)」を持つ(1対多のマッピング)
  • 生成後は要素の追加・削除・更新が不可
  • LINQのToLookupメソッドで作成されることが多く、即時実行されるのが特徴
  • GroupByに似ていますが、lookup[key]のようにインデクサでアクセス可能
  • 「グループごとに値をまとめて管理・参照したい」ときに適している

実装例

// 従業員データの準備
var employees = new[]
{
    new { Name = "田中", Department = "開発" },
    new { Name = "佐藤", Department = "開発" },
    new { Name = "鈴木", Department = "開発" },
    new { Name = "高橋", Department = "営業" },
    new { Name = "渡辺", Department = "営業" },
    new { Name = "山田", Department = "管理" }
};

// LINQで部署別にグループ化してLookupを作成
var departmentLookup = employees.ToLookup(emp => emp.Department, emp => emp.Name);

// 基本的なアクセス方法
foreach (var group in departmentLookup)
{
    Console.WriteLine($"{group.Key} → [{string.Join(", ", group)}]");
}

// 出力内容
// 開発 → [田中, 佐藤, 鈴木]
// 営業 → [高橋, 渡辺]
// 管理 → [山田]

// 指定のキーからアクセス
foreach (var member in departmentLookup["開発"])
{
    Console.WriteLine($"- {member}");
}

// 出力内容
// - 田中
// - 佐藤
// - 鈴木

// 存在しない部署を指定した場合は空のシーケンスが返される
var hrDepartment = departmentLookup["人事部"];
Console.WriteLine($"人事部のメンバー数: {hrDepartment.Count()}");

// 出力内容
// 人事部のメンバー数: 0

まとめ

項目 Dictionary Lookup(ILookup)
構造 キーごとに値を1つ保存(ハッシュテーブル) キーごとに値のグループ(IEnumerable)を保存(内部的にハッシュテーブル管理)
値の個数 各キーに対して単一値 各キーに対して複数値(0個~)
可変性 追加・削除・更新可能(ミュータブル) 生成後は変更不可(イミュータブル)
用途 1対1管理、CRUD、状態管理用途 1対多のグループ化、主にLINQによる集約結果の利用
代表的な生成方法 new Dictionary<TKey, TValue>() IEnumerable.ToLookup()
主なアクセス方法 dict[key] lookup[key] ※戻り値はIEnumerable

参考記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?