[C#] リストやコレクションを辞書にやセット変換する方法 [ToDictionary][ToHashSet]

[C#] リストやコレクションを辞書にやセット変換する方法 [ToDictionary][ToHashSet]

Please input markdown here## Linq でコレクションを辞書やハッシュセットに変換したい

リストなどのコレクションに格納されたデータを辞書やハッシュテーブルに変換したい場合、Linq の ToDictionaryToHashSet が使用できます。

ToDictionary で辞書型に変換

Enumerable.ToDictionary メソッド (System.Linq) | Microsoft Docs

例えば ID と 名前からなる Person 型のデータがあるとして、このデータのリストを辞書に変換する例を考えます。

static void Main(string[] args)
{
    var list = new List<Person>()
    {
        new Person() { ID = 1, Name = "taro" },
        new Person() { ID = 2, Name = "jiro" },
    };

    // 辞書のキーだけを指定する(バリューは元の型Personになる)
    Dictionary<int, Person> dictionary1 = list.ToDictionary(p => p.ID);
    // 辞書のキーとバリュー両方を指定する
    Dictionary<int, string> dictionary2 = list.ToDictionary(p => p.ID, p => p.Name);
}

class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}

ToDictionary は第一引数でキーのセレクタ、第二引数でバリューのセレクタを指定します。第二引数の指定がなければバリューは元の型全体になります。

キーが重複する場合例外が発生するので気を付ける必要があります。

ToHashSet でセットに変換

Enumerable.ToHashSet メソッド (System.Linq) | Microsoft Docs

リストなどのコレクションをセットに変換する場合は ToHashSet で変換できます。

※.NET Framework 4.7.2 以降くらいじゃないと使えないみたいです。

var a = new int[] { 3, 1, 4, 1, 5, 9, 2 };
var set = a.ToHashSet();
Console.WriteLine(set.Count); // 6

// var s = new HashSet<int>(a);
// 上記コードと同じような意味

元のコレクション内に同じ値が存在しても問題なくセットに変換できます。

Linq には重複を削除する Distinct がありますが、ToHashSet にすると型ごと変換してくれます。HashSet のコンストラクタにコレクションを渡した動きと同じようになります。

C#カテゴリの最新記事