C# LINQ を辞書に変換する

C Linq Wo Ci Shuni Bian Huansuru



C# LINQ で辞書を作成する System.Collections.Generic.IEnumerable ToDictionary() メソッドを使用すると可能です。このメソッドは、指定された から を含む辞書を作成します。の System.ArgumentNullException データ ソース、keySelector、または elementSelector が null の場合にスローされます。また、keySelector が 2 つの要素に対して重複したキーを生成する場合、 System.ArgumentException 投げられる。このガイドでは、2 つのメソッドをオーバーロードしてリスト データ ソースからディクショナリを作成する方法について説明します。

構文:

1. 指定されたデータ ソースから指定されたキー セレクターおよび要素セレクター関数に従ってディクショナリを作成する場合は、次のメソッドをオーバーロードします。









パラメーター:



    1. ソース : ソースは、このソースから辞書が作成される IEnumerable (リスト) にすることができます。
    2. キーセレクター : 各要素からキーを取得するために使用される関数です。
    3. 要素セレクター: 要素を取得するために使用する関数です。
    4. Tソース : これは、データ ソースのタイプを指定するタイプ パラメーターです。
    5. Tキー: これは、キーのタイプを指定する type パラメータです。
    6. T要素 : 要素の型を指定する type パラメータです。

2. 指定されたデータ ソースから指定されたキー セレクター関数に従ってディクショナリを作成する場合は、次のメソッドをオーバーロードします。





パラメーター:



    1. ソース : ソースは、このソースから辞書が作成される IEnumerable (リスト) にすることができます。
    2. キーセレクター : 各要素からキーを取得するために使用される関数です。
    3. 出典: これはデータ ソースのタイプを指します。
    4. Tキー : キーの種類を指定します。

例 1: 指定されたキーセレクターとエレメントセレクター関数

5 つのレコードを持つ 4 つの属性 (Acc_ID、Acc_Name、Industry、Revenue) を保持する「Account」タイプのリストを作成します。

1. キーを Acc_ID、値を Acc_Name として、前のリストからディクショナリを作成します。
2. キーを Acc_Name、値を Revenue として、前のリストからディクショナリを作成します。

使用して システム ;
使用して System.Linq ;
使用して System.Collections.Generic ;

クラス 口座情報
{
公共 静的 空所 主要 ( )
{
// タイプ - アカウントのリストを作成します。
リストの詳細 = 新しい リスト ( ) ;
// リストに 5 つのレコードを追加します。
詳細 追加 ( 新しい アカウント { アカウントID = 1 、アカウント名 = 「リナックス」 、 業界 = '教育' 、収益 = 2500 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 2 、アカウント名 = 「パイソン」 、 業界 = 'ブートキャンプ' 、収益 = 10000 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 3 、アカウント名 = 「ジャワ」 、 業界 = '教育' 、収益 = 500 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 4 、アカウント名 = '。ネット' 、 業界 = 'トレーニング' 、収益 = 2080 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 5 、アカウント名 = 「オラクル」 、 業界 = '仕事' 、収益 = 2090年 } ) ;

// キーを Acc_ID、値を Acc_Name として上記のリストから辞書を作成します
コンソール ライトライン ( 「 ----キーは Acc_ID 、値は Acc_Name ----」 ) ;
辞書アカウント_dict1 = 詳細 辞書へ ( j => j アカウントID 、j => j アカウント名 ) ;

フォーリーチ ( KeyValuePair i accounts_dict1 )
{
コンソール ライトライン ( 'アカウントID :' + + ' アカウント名 :' + 価値 ) ;
}

// 上記のリストからキーを Acc_Name、値を Revenue としてディクショナリを作成します
コンソール ライトライン ( 「 ----Acc_Name としてキー、Revenue として値 ----」 ) ;
辞書アカウント_dict2 = 詳細 辞書へ ( => アカウント名 、l => 収益 ) ;

フォーリーチ ( キー値ペア k accounts_dict2 )
{
コンソール ライトライン ( 'アカウント名 :' + k + 「アカウント-収益:」 + k 価値 ) ;
}

}
}

// 4 つの属性を持つアカウントという名前のクラスを作成します
公共 クラス アカウント
{
公共 整数 アカウントID { 得る ; 設定 ; }
公共 アカウント名 { 得る ; 設定 ; }
公共 業界 { 得る ; 設定 ; }
公共 整数 収益 { 得る ; 設定 ; }
}

出力:

説明:

1. 4 つの属性を持つ「Account」という名前のクラスを作成します。

2. メインクラスで「Account」タイプのリストを作成し、そこに 5 つのレコードを挿入します。

3. キーを Acc_ID、値を Acc_Name として、前のリストからディクショナリを作成します。ここでは、TKey を int として指定し、TElement を文字列として指定します。 ToDictionary() メソッド内で、keySelector に Acc_ID を渡し、elementSelector に Acc_Name を渡します。最後に、「foreach」ループを使用してディクショナリを反復し、key プロパティと value プロパティを使用してキーと値を返します。

4. キーを Acc_Name、値を Revenue として、前のリストからディクショナリを作成します。ここでは、TKey を string として指定し、TElement を int として指定します。 ToDictionary() メソッド内で、keySelector に Acc_Name を渡し、elementSelector に Revenue を渡します。最後に、「foreach」ループを使用してディクショナリを反復し、key プロパティと value プロパティを使用してキーと値を返します。

例 2: 指定されたキーセレクター

前のコードを使用して、キーを Acc_ID として前のリストから辞書を作成します。

使用して システム ;
使用して System.Linq ;
使用して System.Collections.Generic ;

クラス 口座情報
{
公共 静的 空所 主要 ( )
{
// タイプ - アカウントのリストを作成します。
リストの詳細 = 新しい リスト ( ) ;
// リストに 5 つのレコードを追加します。
詳細 追加 ( 新しい アカウント { アカウントID = 1 、アカウント名 = 「リナックス」 、 業界 = '教育' 、収益 = 2500 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 2 、アカウント名 = 「パイソン」 、 業界 = 'ブートキャンプ' 、収益 = 10000 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 3 、アカウント名 = 「ジャワ」 、 業界 = '教育' 、収益 = 500 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 4 、アカウント名 = '。ネット' 、 業界 = 'トレーニング' 、収益 = 2080 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 5 、アカウント名 = 「オラクル」 、 業界 = '仕事' 、収益 = 2090年 } ) ;

// キーを Acc_ID として上記のリストから辞書を作成します。
辞書アカウント_dict = 詳細 辞書へ ( j => j アカウントID ) ;
フォーリーチ ( KeyValuePair i accounts_dict )
{
コンソール ライトライン ( '鍵:' + + '--> アカウント名:' + 価値 アカウント名
+ 「アカウント業界:」 + 価値 業界
+ 「アカウント-収益:」 + 価値 収益 ) ;
}

}
}

// 4 つの属性を持つアカウントという名前のクラスを作成します
公共 クラス アカウント
{
公共 整数 アカウントID { 得る ; 設定 ; }
公共 アカウント名 { 得る ; 設定 ; }
公共 業界 { 得る ; 設定 ; }
公共 整数 収益 { 得る ; 設定 ; }
}

出力:

説明:

ここでは、キーを Acc_ID として辞書を作成します。これは、リストから作成した辞書内の各レコードのキーとして機能します。その後、「foreach」ループを使用して、キーと値のプロパティを使用してキーと値 (属性付き) を取得します。

例 3: 重複キー – ArgumentException

2 つのレコードを含むリストを作成し、Acc_ID をキーとして辞書に変換してみます。

使用して システム ;
使用して System.Linq ;
使用して System.Collections.Generic ;

クラス 口座情報
{
公共 静的 空所 主要 ( )
{
// タイプ - アカウントのリストを作成します。
リストの詳細 = 新しい リスト ( ) ;
// リストに 2 つのレコードを追加します。
詳細 追加 ( 新しい アカウント { アカウントID = 1 、アカウント名 = 「リナックス」 、 業界 = '教育' 、収益 = 2500 } ) ;
詳細 追加 ( 新しい アカウント { アカウントID = 1 、アカウント名 = 「パイソン」 、 業界 = 'ブートキャンプ' 、収益 = 10000 } ) ;

// キーを Acc_ID として上記のリストから辞書を作成してみます。
辞書アカウント_dict = 詳細 辞書へ ( j => j アカウントID ) ;

}
}

// 4 つの属性を持つアカウントという名前のクラスを作成します
公共 クラス アカウント
{
公共 整数 アカウントID { 得る ; 設定 ; }
公共 アカウント名 { 得る ; 設定 ; }
公共 業界 { 得る ; 設定 ; }
公共 整数 収益 { 得る ; 設定 ; }
}

例外:

両方の Acc_ID でキーが重複 (1) しているため、未処理の例外 System.ArgumentException が発生します。

例 4: Null ソース – ArgumentNullException

「アカウント」タイプのリストを作成し、それに null を割り当てます。キーを Acc_ID として、前のリストから辞書を作成してみます。

使用して システム ;
使用して System.Linq ;
使用して System.Collections.Generic ;

クラス 口座情報
{
公共 静的 空所 主要 (
{
// タイプ「アカウント」のリストを作成し、それに null を割り当てます。
リストの詳細 = ヌル ;

// キーを Acc_ID として上記のリストから辞書を作成してみます。
辞書アカウント_dict = 詳細 辞書へ ( j => j アカウントID ;

}
}

// 4 つの属性を持つアカウントという名前のクラスを作成します
公共 クラス アカウント
{
公共 整数 アカウントID { 得る ; 設定 ; }
公共 アカウント名 { 得る ; 設定 ; }
公共 業界 { 得る ; 設定 ; }
公共 整数 収益 { 得る ; 設定 ; }
}

例外:

リストが null であるため、ハンドルされない例外 System.ArgumentNullException が発生します。

結論

C# LINQ の ToDictionary() メソッドを使用して、IEnumerable (ここではリスト) から辞書を作成する方法を学びました。このメソッドは 2 つの方法でオーバーロードできます。両方の方法を例を挙げて説明しました。また、データ ソース/keySelector/elementSelector が null でキーが重複している場合に、このメソッドによって発生する 2 つの例外ケースについても学習しました。