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.

azrosen92
quelle
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.

Haney
quelle
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.

Vikram Kumar
quelle
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.

Brendan
quelle
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" }
};
Debendra Dash
quelle
Die ReSharper-Antwort.
Antony Booth
10

In C # 3.0 wurden Objektinitialisierer eingeführt. Überprüfen Sie, auf welche Framework-Version Sie abzielen.

Übersicht über C # 3.0

Zbigniew
quelle
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();
    }
}
ein Netz
quelle
3
Dies ist bereits beantwortet. Nichts Neues hinzufügen.
Nawfal