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.