2013-06-11 12 views
270

Io sono la creazione di un dizionario in un file C# con il seguente codice:Modo corretto per inizializzare un dizionario C# con valori già presenti?

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

C'è una linea rossa sotto new con l'errore:

Feature 'collection initilializer' cannot be used because it is not part of the ISO-2 C# language specification

Qualcuno può spiegare cosa sta succedendo qui?

EDIT: va bene, così si scopre che stavo usando la versione .NET 2.

+0

Usi Mono? – Artemix

+0

Almeno funziona in .Net 4.5. – wonko79

+0

Cosa stai usando? Penso che dovrebbe funzionare su 3.0 e oltre ... – Andrew

risposta

452

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

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

     Console.ReadKey(); 
    } 
} 

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

+7

Il problema è la versione di C# utilizzata dall'OP, gli inizializzatori di oggetti/raccolte non sono stati introdotti fino al C# 3.0. Il dettaglio sul perché non ha funzionato prima è già stato [risposto] (http://stackoverflow.com/questions/459652/why-do-c-sharp-collection-initializers-work-this-way). – James

+0

@James - Modificato per indicare come tale. – Haney

+0

Come posso verificare quale versione di C# sto usando o modificarla? – azrosen92

7

Gli inizializzatori di oggetti sono stati introdotti in C# 3.0, verificare quale versione di framework si desidera utilizzare.

Overview of C# 3.0

102

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

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

Funziona anche con tipi personalizzati.

+3

Per le persone più interessate a questa nuova sintassi, ecco un buon post sul blog: https://marcin-chwedczuk.github.io/object-and-collection-initializers-in-csharp – csharpfolk

+0

Questo è perfetto per la dichiarazione in linea. – Tiramonium

+0

Nice - non conoscevo questo modo di inizializzare. Sembra un po 'come Python)) Grazie! –

18

È possibile inizializzare uno Dictionary (e altre raccolte) in linea. Ogni membro è contenuta con bretelle:

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.

6

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 inizializzare come segue.

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