Richtiger Weg, um ein C # -Wörterbuch mit Werten zu initialisieren?


513

Ich erstelle ein Wörterbuch in einer C # -Datei mit dem folgenden Code:

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

Es gibt eine rote Linie newmit dem Fehler:

Die Funktion 'Collection Initilializer' kann nicht verwendet werden, da sie nicht Teil der ISO-2 C # -Sprachenspezifikation ist

Kann jemand erklären, was hier los ist?

EDIT: Okay, es stellte sich heraus, dass ich .NET Version 2 verwendet habe.


3
Ändern Sie die gezielte Framework-Version oder verwenden Sie die "alte" Art der Initialisierung.
— Sebastian Ðymel

In welchen Kontext stellen Sie diesen Code? Eine .csDatei, die von Visual Studio kompiliert wird, oder in einem .cshtml? Hat Ihre Projektdatei ein languageVersionElement ?
— CodeCaster

Antworten:


826

Ich kann dieses Problem in einer einfachen .NET 4.0-Konsolenanwendung nicht reproduzieren:

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

        Console.ReadKey();
    }
}

Können Sie versuchen, es in einer einfachen Konsolenanwendung zu reproduzieren und von dort aus fortzufahren? Es ist wahrscheinlich, dass Sie auf .NET 2.0 (das es nicht unterstützt) oder das Client-Profil-Framework abzielen und nicht auf eine Version von .NET, die die Initialisierungssyntax unterstützt.


11
Das Problem ist die Version von C #, die das OP verwendet. Objekt- / Sammlungsinitialisierer wurden erst in C # 3.0 eingeführt. Das Detail, warum es vorher nicht funktioniert hat, wurde bereits beantwortet .
— James

@James - Bearbeitet, um als solche anzuzeigen.
— Haney

Wie überprüfe ich, welche Version von C # ich verwende oder ändere ich sie?
— Azrosen92

3
Die Projekteigenschaften geben die Zielversion des Frameworks an.
— Haney

2
@James - Nicht zuverlässig, da diese Person möglicherweise einige Legacy-Arbeiten in einer Lösung aufgreift, die auf 2.0 abzielt und sich dessen beispielsweise nicht bewusst ist.
— Haney

198

Mit C # 6.0 können Sie ein Wörterbuch folgendermaßen erstellen:

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

Es funktioniert sogar mit benutzerdefinierten Typen.


8
Für Leute, die mehr an dieser neuen Syntax interessiert sind, gibt es hier einen guten Blog-Beitrag: marcin-chwedczuk.github.io/…
— csharpfolk

1
Dies ist perfekt für die Inline-Deklaration.
— Tiramonium

1
Schön - kannte diese Art der Initialisierung nicht. Sieht ein bisschen aus wie Python)) Danke!
— Mikhail T.

Ich mag Ihren Weg weiter, aber nehmen Sie zur Kenntnis, dass er genau die gleiche Anzahl von "Boilerplate" -Zeichen pro Zeile (4) verwendet wie die akzeptierte Antwort mit {"key2", "value2"},
— Maxter

35

Sie können eine DictionaryInline (und andere Sammlungen) initialisieren . Jedes Mitglied ist in geschweiften Klammern enthalten:

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

Siehe MSDN für Details.


21

Angenommen, wir haben ein solches Wörterbuch

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

Wir können es wie folgt initialisieren.

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

Die ReSharper-Antwort.
— Antony Booth


0

mit c # 6.0

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

        Console.ReadKey();
    }
}

3
Dies ist bereits beantwortet. Nichts Neues hinzufügen.
— Nawfal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.