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.


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.


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.


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.


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

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

3
C'est déjà répondu. N'ajoutant rien de nouveau.
Nawfal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.