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.