Modo corretto di inizializzare un dizionario C # con valori?


514

Sto creando un dizionario in un file C # con il seguente codice:

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

C'è una linea rossa sotto newcon l'errore:

La funzione "inizializzatore di raccolta" non può essere utilizzata perché non fa parte delle specifiche del linguaggio ISO # 2 C #

Qualcuno può spiegare cosa sta succedendo qui?

EDIT: okay, quindi risulta che stavo usando .NET versione 2.


3
Modifica la versione del framework di destinazione o utilizza il "vecchio" metodo di inizializzazione.
Sebastian Ðymel,

In quale contesto inserisci questo codice? Un .csfile che viene compilato da Visual Studio o in un .cshtml? Il tuo file di progetto ha un languageVersionelemento ?
CodeCaster l'

Risposte:


827

Non riesco a riprodurre questo problema in una semplice applicazione console .NET 4.0:

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

        Console.ReadKey();
    }
}

Puoi provare a riprodurlo in una semplice applicazione Console e andare da lì? Sembra probabile che tu stia prendendo di mira .NET 2.0 (che non lo supporta) o il framework del profilo client, piuttosto che una versione di .NET che supporti la sintassi di inizializzazione.


12
Il problema è la versione di C # utilizzata dall'OP, gli inizializzatori oggetto / raccolta non sono stati introdotti fino a C # 3.0. Il dettaglio sul perché non ha funzionato prima ha già ricevuto risposta .
James,

@James - Modificato per indicare come tale.
Haney

Come posso verificare quale versione di C # sto usando o cambiarla?
Azrosen92,

3
Le proprietà del progetto indicheranno la versione di destinazione del framework.
Haney

2
@James - Non in modo affidabile, tuttavia, poiché questa persona potrebbe raccogliere un lavoro legacy in una soluzione che si rivolge a 2.0 e non ne è consapevole, ad esempio.
Haney

198

Con C # 6.0, è possibile creare un dizionario nel modo seguente:

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

Funziona anche con tipi personalizzati.


8
Per le persone più interessate a questa nuova sintassi ecco un buon post sul blog: marcin-chwedczuk.github.io/…
csharpfolk,

1
Questo è perfetto per la dichiarazione in linea.
Tiramonium,

1
Bello - non conoscevo questo modo di inizializzare. Sembra un po 'Python)) Grazie!
Mikhail T.

Mi piace il tuo modo migliore, ma prendi nota che utilizza esattamente lo stesso numero di caratteri "plateplate" per riga (4) della risposta accettata con {"key2", "value2"},
Maxter

35

Puoi inizializzare una Dictionary(e altre raccolte) in linea. Ogni membro è contenuto con parentesi graffe:

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

Vedi MSDN per i dettagli.


21

Supponiamo di avere un dizionario come questo

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

Possiamo inizializzarlo come segue.

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

La risposta di ReSharper.
Antony Booth,


0

con c # 6.0

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

        Console.ReadKey();
    }
}

3
Questa è già una risposta. Non aggiungere nulla di nuovo.
nawfal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.