構文:
1. 指定されたデータ ソースから指定されたキー セレクターおよび要素セレクター関数に従ってディクショナリを作成する場合は、次のメソッドをオーバーロードします。
パラメーター:
-
- ソース : ソースは、このソースから辞書が作成される IEnumerable (リスト) にすることができます。
- キーセレクター : 各要素からキーを取得するために使用される関数です。
- 要素セレクター: 要素を取得するために使用する関数です。
- Tソース : これは、データ ソースのタイプを指定するタイプ パラメーターです。
- Tキー: これは、キーのタイプを指定する type パラメータです。
- T要素 : 要素の型を指定する type パラメータです。
2. 指定されたデータ ソースから指定されたキー セレクター関数に従ってディクショナリを作成する場合は、次のメソッドをオーバーロードします。
パラメーター:
-
- ソース : ソースは、このソースから辞書が作成される IEnumerable (リスト) にすることができます。
- キーセレクター : 各要素からキーを取得するために使用される関数です。
- 出典: これはデータ ソースのタイプを指します。
- 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 つの例外ケースについても学習しました。