Właściwy sposób na zainicjowanie słownika C # z wartościami?


513

Tworzę słownik w pliku C # z następującym kodem:

private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT
        = new Dictionary<string, XlFileFormat>
        {
            {"csv", XlFileFormat.xlCSV},
            {"html", XlFileFormat.xlHtml}
        };

Pod newbłędem znajduje się czerwona linia :

Nie można użyć funkcji inicjalizującej kolekcję, ponieważ nie jest ona częścią specyfikacji języka ISO-2 C #

Czy ktoś może wyjaśnić, co się tutaj dzieje?

EDYCJA: w porządku, więc okazuje się, że korzystałem z .NET w wersji 2.


3
Zmień docelową wersję frameworka lub użyj „starej” metody inicjalizacji.
Sebastian Ðymel

W jakim kontekście umieszczasz ten kod? .csPlik, który zostanie opracowany przez Visual Studio, albo w .cshtml? Czy plik projektu ma languageVersionelement ?
CodeCaster,

Odpowiedzi:


826

Nie mogę odtworzyć tego problemu w prostej aplikacji konsoli .NET 4.0:

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
            { "key1", "value1" },
            { "key2", "value2" }
        };

        Console.ReadKey();
    }
}

Czy możesz spróbować odtworzyć go w prostej aplikacji na konsolę i przejść stamtąd? Wydaje się prawdopodobne, że celujesz w .NET 2.0 (który go nie obsługuje) lub w strukturę profilu klienta, a nie w wersję .NET, która obsługuje składnię inicjującą.


11
Problemem jest wersja C #, której używa OP, inicjalizatory obiektów / kolekcji zostały wprowadzone dopiero w C # 3.0. Odpowiedź na pytanie, dlaczego wcześniej nie działał, została już udzielona .
James

@James - Edytowany, aby wskazać jako taki.
Haney

Jak mogę sprawdzić, której wersji C # używam lub zmienić?
azrosen92,

3
Właściwości projektu będą wskazywać docelową wersję frameworka.
Haney

2
@James - Jednak nie niezawodnie, ponieważ ta osoba może na przykład podjąć starszą pracę w rozwiązaniu, które było skierowane do wersji 2.0 i na przykład o tym nie wie.
Haney

197

W wersji C # 6.0 możesz utworzyć słownik w następujący sposób:

var dict = new Dictionary<string, int>
{
    ["one"] = 1,
    ["two"] = 2,
    ["three"] = 3
};

Działa nawet z niestandardowymi typami.


8
Dla osób bardziej zainteresowanych tą nową składnią jest dobry post na blogu: marcin-chwedczuk.github.io/…
csharpfolk

1
Jest to idealne rozwiązanie do deklaracji wbudowanej.
Tiramonium,

1
Fajnie - nie znałem tego sposobu parafowania. Wygląda trochę jak Python)) Dziękuję!
Mikhail T.,

Podoba mi się twoja droga, ale zanotuj, że używa dokładnie tej samej liczby znaków „bojlera” w wierszu (4), co zaakceptowana odpowiedź z {„key2”, „value2”},
Maxter

35

Możesz zainicjować Dictionary(i inne kolekcje) wbudowane. Każdy element zawiera nawiasy klamrowe:

Dictionary<int, StudentName> 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 } }
};

Szczegółowe informacje można znaleźć w MSDN .


21

Załóżmy, że mamy taki słownik

Dictionary<int,string> dict = new Dictionary<int, string>();
dict.Add(1, "Mohan");
dict.Add(2, "Kishor");
dict.Add(3, "Pankaj");
dict.Add(4, "Jeetu");

Możemy zainicjować go w następujący sposób.

Dictionary<int, string> dict = new Dictionary<int, string>  
{
    { 1, "Mohan" },
    { 2, "Kishor" },
    { 3, "Pankaj" },
    { 4, "Jeetu" }
};

Odpowiedź ReSharper.
Antony Booth


0

z wersją c # 6.0

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
           ["Key1"]="Value1",
           ["Key2"]="Value2"
        };

        Console.ReadKey();
    }
}

2
To jest już odpowiedź. Nie dodawanie niczego nowego.
nawfal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.