コレクション初期化子を使用してディクショナリを初期化する方法 (C# プログラミング ガイド)

Dictionary<TKey,TValue> にはキーと値のペアのコレクションが含まれています。 その Add メソッドは、それぞれキーと値に対する 2 つのパラメーターを受け取ります。 Add メソッドが複数のパラメーターを受け取る Dictionary<TKey,TValue> またはコレクションを初期化する 1 つの方法は、次の例に示すように、各パラメーターのセットを中かっこで囲むことです。 もう 1 つのオプションは、インデックス初期化子を使用することです。これも次の例に示されています。

注意

コレクションを初期化するこの 2 つの方法の主な違いは、キーが重複している場合にあります。次に例を示します。

{ 111, new StudentName { FirstName="Sachin", LastName="Karnik", ID=211 } },
{ 111, new StudentName { FirstName="Dina", LastName="Salimzianova", ID=317 } }, 

Add メソッドからは ArgumentException がスローされます: 'An item with the same key has already been added. Key: 111'。一方、例の 2 番目の部分であるパブリック読み取り/書き込みインデクサー メソッドでは、既存のエントリを同じキーで静かに上書きします。

次のコード例では、Dictionary<TKey,TValue> が型 StudentName のインスタンスで初期化されています。 最初の初期化では、Add メソッドを 2 つの引数と共に使用します。 コンパイラにより、int キーと StudentName 値の各ペアに対して、Add への呼び出しが生成されます。 2 回目の初期化では、Dictionary クラスのパブリック読み取り/書き込みインデクサー メソッドを使用します。

public class HowToDictionaryInitializer
{
    class StudentName
    {
        public string? FirstName { get; set; }
        public string? LastName { get; set; }
        public int ID { get; set; }
    }

    public static void Main()
    {
        var students = new Dictionary<int, StudentName>()
        {
            { 111, new StudentName { FirstName="Sachin", LastName="Karnik", ID=211 } },
            { 112, new StudentName { FirstName="Dina", LastName="Salimzianova", ID=317 } },
            { 113, new StudentName { FirstName="Andy", LastName="Ruth", ID=198 } }
        };

        foreach(var index in Enumerable.Range(111, 3))
        {
            Console.WriteLine($"Student {index} is {students[index].FirstName} {students[index].LastName}");
        }
        Console.WriteLine();		

        var students2 = new Dictionary<int, StudentName>()
        {
            [111] = new StudentName { FirstName="Sachin", LastName="Karnik", ID=211 },
            [112] = new StudentName { FirstName="Dina", LastName="Salimzianova", ID=317 } ,
            [113] = new StudentName { FirstName="Andy", LastName="Ruth", ID=198 }
        };

        foreach (var index in Enumerable.Range(111, 3))
        {
            Console.WriteLine($"Student {index} is {students2[index].FirstName} {students2[index].LastName}");
        }
    }
}

最初の宣言のコレクションの各要素の中かっこの 2 つのペアに注目してください。 最も内側の中かっこは StudentName のオブジェクト初期化子を囲み、最も外側の中かっこは、students Dictionary<TKey,TValue> に追加されるキーと値のペアの初期化子を囲んでいます。 最後に、ディクショナリのコレクション初期化子全体が中かっこで囲まれています。 2 回目の初期化では、代入の左辺はキーで、右辺は StudentName のオブジェクトの初期化子を使用する値です。

関連項目