Une bonne façon d'initialiser un dictionnaire C # avec des valeurs?

514

Je crée un dictionnaire dans un fichier C # avec le code suivant:

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

Il y a une ligne rouge sous newavec l'erreur:

La fonctionnalité 'initiateur de collection' ne peut pas être utilisée car elle ne fait pas partie de la spécification du langage ISO-2 C #

Quelqu'un peut-il expliquer ce qui se passe ici?

EDIT: d' accord, il s'avère que j'utilisais .NET version 2.

azrosen92
la source
3
Modifiez la version du framework ciblée ou utilisez l '"ancienne" méthode d'initialisation.
Sebastian Ðymel
Dans quel contexte placez-vous ce code? Un .csfichier qui est compilé par Visual Studio, ou dans un .cshtml? Votre dossier de projet contient-il un languageVersionélément ?
CodeCaster

Réponses:

827

Je ne peux pas reproduire ce problème dans une simple application console .NET 4.0:

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

        Console.ReadKey();
    }
}

Pouvez-vous essayer de le reproduire dans une simple application console et partir de là? Il semble probable que vous ciblez .NET 2.0 (qui ne le prend pas en charge) ou le cadre de profil client, plutôt qu'une version de .NET qui prend en charge la syntaxe d'initialisation.

Haney
la source
12
Le problème est la version de C # que l'OP utilise, les initialiseurs d'objet / collection n'ont pas été introduits avant C # 3.0. Le détail des raisons pour lesquelles cela n'a pas fonctionné auparavant a déjà été répondu .
James
@James - Modifié pour indiquer en tant que tel.
Haney
Comment vérifier quelle version de C # j'utilise ou la changer?
azrosen92
3
Les propriétés du projet indiqueront la version cible du framework.
Haney
2
@James - Pas de manière fiable, cependant, car cette personne peut reprendre un travail hérité dans une solution qui ciblait 2.0 et ne le sait pas, par exemple.
Haney
198

Avec C # 6.0, vous pouvez créer un dictionnaire de la manière suivante:

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

Il fonctionne même avec des types personnalisés.

Vikram Kumar
la source
8
Pour les personnes plus intéressées par cette nouvelle syntaxe, voici un bon article de blog: marcin-chwedczuk.github.io/…
csharpfolk
1
C'est parfait pour la déclaration en ligne.
Tiramonium
1
Bien - je ne connaissais pas cette façon de procéder. Ressemble un peu à Python)) Merci!
Mikhail T.
J'aime mieux votre chemin, mais prenez note qu'il utilise exactement le même nombre de caractères "passe-partout" par ligne (4) que la réponse acceptée avec {"key2", "value2"},
Maxter
35

Vous pouvez initialiser un Dictionary(et d'autres collections) en ligne. Chaque membre est contenu avec des accolades:

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

Voir MSDN pour plus de détails.

Brendan
la source
21

Supposons que nous ayons un dictionnaire comme celui-ci

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

Nous pouvons l'initialiser comme suit.

Dictionary<int, string> dict = new Dictionary<int, string>  
{
    { 1, "Mohan" },
    { 2, "Kishor" },
    { 3, "Pankaj" },
    { 4, "Jeetu" }
};
Debendra Dash
la source
La réponse ReSharper.
Antony Booth
0

avec c # 6.0

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

        Console.ReadKey();
    }
}
amesh
la source
3
C'est déjà répondu. N'ajoutant rien de nouveau.
Nawfal