C# Tips | コレクション・LINQ:Dictionary→List

C# C#
スポンサーリンク

はじめに:Dictionary→List は“いったん平らに戻す”操作

Dictionary は「キーで一発検索できる」便利な入れ物ですが、
ときどき「順番に並べて処理したい」「LINQ でゴリゴリ絞り込みたい」という場面が出てきます。

そんなときにやるのが「Dictionary→List」変換です。
C# では ToListSelect を使って、辞書をいろいろな形の List<T> に変換できます。

ここでは、初心者向けに

  • 「Dictionary をそのまま List にする」基本形
  • 「Key だけ」「Value だけ」を List にする
  • 「好きな形の List に投影する」実務パターン

を、例題付きでかみ砕いて説明します。


基本:Dictionary をそのまま List にする

KeyValuePair<TKey, TValue> の List に変換する

いちばんストレートな「Dictionary→List」は、
KeyValuePair<TKey, TValue>List にする方法です。

using System;
using System.Collections.Generic;
using System.Linq;

var dic = new Dictionary<string, string>
{
    ["01"] = "大阪",
    ["02"] = "京都",
    ["03"] = "神戸",
};

var list = dic.ToList(); // List<KeyValuePair<string, string>>
C#

list の中身は、こんなイメージです。

[Key="01", Value="大阪"]
[Key="02", Value="京都"]
[Key="03", Value="神戸"]

KeyValuePair<TKey, TValue> は「Key プロパティ」と「Value プロパティ」を持つだけの構造です。

foreach (var kv in list)
{
    Console.WriteLine($"{kv.Key}: {kv.Value}");
}
C#

ここでの重要ポイントは、「Dictionary に対して ToList() を呼ぶと、List<KeyValuePair<TKey, TValue>> になる」ということです。
「キーと値のペアをそのまま列として扱いたい」なら、この形が素直です。


Key だけ/Value だけを List にする

Key だけを List にする

「キー一覧だけ欲しい」場面はかなり多いです。

var keys = dic.Keys.ToList(); // List<string>
C#

dic.KeysKeyCollection ですが、ToList() を呼べば List<string> になります。

foreach (var code in keys)
{
    Console.WriteLine(code);
}
C#

ここでの重要ポイントは、「Keys プロパティは“キーだけの列”として扱える」ということです。
ToList() を付けるかどうかは、「List として保持したいか」「列として一時的に使うだけか」で決めればOKです。

Value だけを List にする

同じように、「値だけ欲しい」こともあります。

var values = dic.Values.ToList(); // List<string>
C#
foreach (var name in values)
{
    Console.WriteLine(name);
}
C#

ここでの重要ポイントは、「Values プロパティで“値だけの列”を取り出せる」ことです。
「Dictionary の Value を List にしたい」ときに、わざわざ Select(x => x.Value) と書かなくても済みます。


好きな形の List に変換する(Select で投影)

匿名型の List にする

「Key と Value をまとめて、でも KeyValuePair じゃなくて自分の形にしたい」
そんなときは Select で投影します。

var items = dic
    .Select(kv => new
    {
        Code = kv.Key,
        Name = kv.Value
    })
    .ToList();
C#

items は「Code と Name を持つ匿名型の List」になります。

foreach (var x in items)
{
    Console.WriteLine($"{x.Code}: {x.Name}");
}
C#

ここでの重要ポイントは、「Select で“List の中身の型”を自由に決められる」ことです。
Dictionary を一度「列」として見て、そこから好きな形に変換しているイメージです。

自前のクラスに変換する

業務では、専用の DTO や ViewModel に変換したいことも多いです。

public class Area
{
    public string Code { get; set; } = "";
    public string Name { get; set; } = "";
}
C#
var areas = dic
    .Select(kv => new Area
    {
        Code = kv.Key,
        Name = kv.Value
    })
    .ToList();
C#

これで List<Area> が手に入ります。

ここでの重要ポイントは、「Dictionary→List は“データの形を整えるタイミング”として使える」ということです。
単に List にするだけでなく、「画面用の形」「API 返却用の形」に整えるのにちょうどいいポイントになります。


実務で意識してほしいこと

「なぜ List に戻したいのか」を言葉にしてから書く

Dictionary を List に戻す前に、必ず自分に問いかけてください。

順番に並べて表示したいのか
LINQ でフィルタ・ソートをかけたいのか
別の型(DTO / ViewModel)に詰め替えたいのか

目的が決まれば、書き方も決まります。

順番に並べたい → dic.OrderBy(kv => kv.Key).ToList()
値だけ欲しい → dic.Values.ToList()
DTO にしたい → dic.Select(kv => new Xxx { ... }).ToList()

という具合です。

「KeyValuePair のまま扱う」か「別型にする」かを決める

KeyValuePair<TKey, TValue> のままでも十分読める場面もあれば、
CodeName といったプロパティ名を持つクラスにしたほうが読みやすい場面もあります。

短い処理・一時的な処理なら KeyValuePair のまま。
画面や API など、あちこちで使うなら専用クラスに変換。

このくらいの基準で決めると、コードがスッキリします。


まとめ:Dictionary→List は“再び流せる形に戻す”ための小技

Dictionary→List の本質は、

「キー検索に強い形(Dictionary)を、
 再び“流して加工しやすい形(List)”に戻す」

ことです。

押さえておきたいポイントは、

  • dic.ToList()List<KeyValuePair<TKey, TValue>>
  • dic.Keys.ToList() でキーだけの List<TKey>
  • dic.Values.ToList() で値だけの List<TValue>
  • Select と組み合わせて、好きな型の List<T> に投影

このあたりが自然に書けるようになると、
「Dictionary で一度インデックスを貼ってから、必要に応じて List に戻して加工する」という、
業務コードでよく使う流れを、気持ちよく書けるようになります。

タイトルとURLをコピーしました