[C# LINQ] Select、Whereした結果をDictionary型に変換する

LINQのToDictionaryメソッドを使うと、配列やリスト、そしてそれらをSelect、Whereした結果をDictionary型に変換することができます。

スポンサーリンク

ToDictionaryメソッドの使い方

まず、LINQの機能を使うためには 名前空間System.Linq が必要です。

using System.Linq;

Keyを指定してDictionary型に変換する

ToDictionaryメソッドの引数にキーにする項目を返すメソッドを指定します。
通常、ラムダ式を使いその場限りのメソッドを作って渡します。

ラムダ式について知りたい方は、
[C# 入門] 匿名関数(ラムダ式)の使い道を見てみてください。

キーにする項目を返すメソッドにはデータソースの要素が渡されます。
戻り値にはキーにしたい項目を返すようにします。

Dictionaryに変換した値を入れる変数(dic1)ですが、サンプルはきちんと型を書いていますが、通常は型推論varを使った方が便利です。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // 変換したいデータ
        List<SampleData> list = new List<SampleData> { 
            new SampleData { Data1 = 1, Data2 = 2, Data3 = 3 },
            new SampleData { Data1 = 4, Data2 = 5, Data3 = 6 },
            new SampleData { Data1 = 7, Data2 = 8, Data3 = 9 },
        };

        /*  
         *  ToDictionayメソッドでDictionary型に変換
         *  引数にはKeyにする項目を返すメソッドを指定する
         *  Valueには各要素が設定される
         */
        Dictionary<int, SampleData> dic1 = list.ToDictionary(d => d.Data1);

        // 結果を表示
        foreach (KeyValuePair<int, SampleData> kv in dic1) {
            Console.WriteLine($"Key = {kv.Key}, Value = [ Data1={kv.Value.Data1}, Data1={kv.Value.Data2}, Data3={kv.Value.Data3}]");
        }
    }
}
Key = 1, Value = [ Data1=1, Data1=2, Data3=3]
Key = 4, Value = [ Data1=4, Data1=5, Data3=6]
Key = 7, Value = [ Data1=7, Data1=8, Data3=9]

KeyとValueを指定してDictionary型に変換する

ToDictionaryメソッドに引数を2つ指定します。
第1引数にはKeyにする項目を返すメソッドを指定します。
第2引数にはValueにする項目を返すメソッドを指定します。

Valueにする項目を返すメソッドは必要な項目だけを詰め込んだ新しい型(匿名クラスやタプル)を返すことが多いです。
匿名クラス、タプルについて知りたい方はこちらを見てみてください。
[C# 入門] 匿名クラス(匿名型)の使い方
[C# 入門] タプルを使って1つの変数で複数の値を扱う

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // 変換したいデータ
        List<SampleData> list = new List<SampleData> { 
            new SampleData { Data1 = 1, Data2 = 2, Data3 = 3 },
            new SampleData { Data1 = 4, Data2 = 5, Data3 = 6 },
            new SampleData { Data1 = 7, Data2 = 8, Data3 = 9 },
        };

        /*
         *  ToDictionayメソッドでDictionary型に変換
         *  第1引数にはKeyにする項目を返すメソッドを指定する
         *  第2引数にはValueにする項目を返すメソッドを指定する
         */
        Dictionary<int, (int, int)> dic2 = list.ToDictionary(d => d.Data1, d => (d.Data2, d.Data3));

        // 結果の表示
        foreach (KeyValuePair<int, (int, int)> kv in dic2) {
            Console.WriteLine($"Key = {kv.Key}, Value = ( {kv.Value.Item1}, {kv.Value.Item2} )");
        }
    }
}

class SampleData
{
    public int Data1 { get; set; }
    public int Data2 { get; set; }
    public int Data3 { get; set; }
}
Key = 1, Value = ( 2, 3 )
Key = 4, Value = ( 5, 6 )
Key = 7, Value = ( 8, 9 )
スポンサーリンク

Select、Whereした結果を変換する

SelectやWhereした結果をDictionary型に変換する場合も配列、リストを変換する時とやり方は変わりませんが、1つ覚えておくことがあります。

ToDictionaryメソッドは即時評価されます。
Selectメソッド、Whereメソッドは遅延評価といって結果を取り出す必要が出てきたときに実行されます。ToDictionaryメソッド呼び出すとその場でSelect、Whereが実行され、すぐに変換された値を取得することができます。

Valueにする項目はToDictionaryの引数で自由に指定できるので、たいていはWhereを使って条件で絞った結果をDictionary型にするということが多いかと思います。
Whereメソッドについて知りたい方は、
[C# LINQ] Whereメソッドで条件を満たす要素だけを取り出すを見てみてください。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // 変換したいデータ
        List<SampleData> list = new List<SampleData> { 
            new SampleData { Data1 = 10, Data2 = 2, Data3 = 3 },
            new SampleData { Data1 = 20, Data2 = 5, Data3 = 6 },
            new SampleData { Data1 = 30, Data2 = 8, Data3 = 9 },
        };

        // Whereした結果をDictionary型に変換する
        Dictionary<int, (int, int)> dic3 = 
            list.Where(d => d.Data1 >= 20).ToDictionary(d => d.Data1, d => (d.Data2, d.Data3));

        // 結果の表示
        foreach (KeyValuePair<int, (int, int)> kv in dic3) {
            Console.WriteLine($"Key = {kv.Key}, Value = ( {kv.Value.Item1}, {kv.Value.Item2} )");
        }
    }
}

class SampleData
{
    public int Data1 { get; set; }
    public int Data2 { get; set; }
    public int Data3 { get; set; }
}
Key = 20, Value = ( 5, 6 )
Key = 30, Value = ( 8, 9 )

C# プログラミング講座に戻る

コメント

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