Udostępnij za pośrednictwem


Jak zainicjować słownik za pomocą inicjatora kolekcji (Przewodnik programowania w języku C#)

Element zawiera Dictionary<TKey,TValue> kolekcję par klucz/wartość. Metoda Add przyjmuje dwa parametry, jeden dla klucza i jeden dla wartości. Jednym ze sposobów inicjowania kolekcji lub kolekcji Dictionary<TKey,TValue>, której Add metoda przyjmuje wiele parametrów, jest ujęcie każdego zestawu parametrów w nawiasach klamrowych, jak pokazano w poniższym przykładzie. Inną opcją jest użycie inicjatora indeksu, pokazanego również w poniższym przykładzie.

Uwaga

Główna różnica między tymi dwoma sposobami inicjowania kolekcji polega na tym, że w przypadku zduplikowanych kluczy, na przykład:

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

Add metoda zgłosi wartość ArgumentException: 'An item with the same key has already been added. Key: 111', podczas gdy druga część przykładu, publiczna metoda indeksatora odczytu/zapisu po cichu zastąpi już istniejący wpis tym samym kluczem.

Przykład

W poniższym przykładzie Dictionary<TKey,TValue> kodu element jest inicjowany z wystąpieniami typu StudentName. Pierwsza inicjalizacja Add używa metody z dwoma argumentami. Kompilator generuje wywołanie Add dla każdej pary int kluczy i StudentName wartości. Drugi używa publicznej metody indeksatora Dictionary odczytu/zapisu klasy:

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}");
        }
    }
}

Zwróć uwagę na dwie pary nawiasów klamrowych w każdym elemecie kolekcji w pierwszej deklaracji. Najbardziej wewnętrzne nawiasy klamrowe otaczają inicjator obiektu dla StudentNameelementu , a najbardziej zewnętrzne nawiasy klamrowe otaczają inicjator pary klucz/wartość, które mają zostać dodane do klasy students Dictionary<TKey,TValue>. Na koniec cały inicjator kolekcji dla słownika jest ujęty w nawiasy klamrowe. W drugiej inicjalizacji lewa strona przypisania jest kluczem, a po prawej stronie jest wartość przy użyciu inicjatora obiektu dla StudentNameelementu .

Zobacz też