Come inizializzare un dizionario con un inizializzatore di insieme (Guida per programmatori C#)

Un oggetto Dictionary<TKey,TValue> contiene una raccolta di coppie chiave-valore. Il relativo metodo Add accetta due parametri, uno per la chiave e uno per il valore. Un modo per inizializzare un oggetto Dictionary<TKey,TValue> o qualsiasi raccolta il cui metodo Add accetta più parametri, consiste nel racchiudere ogni set di parametri tra parentesi graffe, come illustrato nell'esempio seguente. Un'altra opzione consiste nell'usare un inizializzatore di indice, come mostrato nell'esempio seguente.

Nota

La differenza principale tra questi due modi per inizializzare la raccolta è che in caso di chiavi duplicate, ad esempio:

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

Add il metodo genererà ArgumentException: 'An item with the same key has already been added. Key: 111', mentre la seconda parte dell'esempio, il metodo dell'indicizzatore di lettura/scrittura pubblico sovrascriverà in modo silenzioso la voce già esistente con la stessa chiave.

Esempio

Nell'esempio di codice seguente, viene inizializzato un oggetto Dictionary<TKey,TValue> con istanze di tipo StudentName. La prima inizializzazione usa il metodo Add con due argomenti. Il compilatore genera una chiamata a Add per ognuna delle coppie di chiavi int e valori StudentName. Il secondo usa un metodo di lettura pubblica / indicizzatore di scrittura della classe 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}");
        }
    }
}

Si noti che vi sono due coppie di parentesi graffe in ogni elemento della raccolta nella prima dichiarazione. Le parentesi graffe più interne racchiudono l'inizializzatore di oggetto per StudentNamee le parentesi graffe più esterne racchiudono l'inizializzatore per la coppia chiave/valore da aggiungere a studentsDictionary<TKey,TValue>. Infine, tutto l'inizializzatore di insieme per il dizionario è racchiuso tra parentesi graffe. Durante la seconda inizializzazione, il lato sinistro dell'assegnazione è la chiave e il lato destro è il valore, usando un inizializzatore di oggetto per StudentName.

Vedi anche