Guide pratique pour initialiser un dictionnaire avec un initialiseur de collection (Guide de programmation C#)

Un Dictionary<TKey,TValue> contient une collection de paires clé/valeur. Sa méthode Add prend deux paramètres, un pour la clé et un pour la valeur. Une façon d’initialiser un Dictionary<TKey,TValue> ou toute collection dont la méthode Add prend plusieurs paramètres consiste à mettre chaque jeu de paramètres entre accolades, comme illustré dans l’exemple suivant. Une autre option consiste à utiliser un initialiseur d’index, également illustré dans l’exemple suivant.

Notes

Il existe une différence majeure entre ces deux méthodes d’initialisation de la collection. Dans le cas de clés dupliquées, par exemple :

{ 111, new StudentName { FirstName="Sachin", LastName="Karnik", ID=211 } },
{ 111, new StudentName { FirstName="Dina", LastName="Salimzianova", ID=317 } }, 

La méthode Add lève ArgumentException : 'An item with the same key has already been added. Key: 111', tandis que la deuxième partie de l’exemple, la méthode d’indexation publique en lecture/écriture, remplace silencieusement l’entrée existante par la même clé.

Exemple

Dans l’exemple de code suivant, un Dictionary<TKey,TValue> est initialisé avec des instances de type StudentName. La première initialisation utilise la méthode Add avec deux arguments. Le compilateur génère un appel à Add pour chacune des paires de clés int et de valeurs StudentName. Le deuxième utilise une méthode d’indexeur publique en lecture/écriture de la classe Dictionary :

public class HowToDictionaryInitializer
{
    class StudentName
    {
        public string? FirstName { get; set; }
        public string? LastName { get; set; }
        public int ID { get; set; }
    }

    public static void Main()
    {
        var 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 } }
        };

        foreach(var index in Enumerable.Range(111, 3))
        {
            Console.WriteLine($"Student {index} is {students[index].FirstName} {students[index].LastName}");
        }
        Console.WriteLine();		

        var students2 = 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 }
        };

        foreach (var index in Enumerable.Range(111, 3))
        {
            Console.WriteLine($"Student {index} is {students2[index].FirstName} {students2[index].LastName}");
        }
    }
}

Notez les deux paires d’accolades dans chaque élément de la collection dans la première déclaration. Les accolades les plus intérieures encadrent l’initialiseur d’objet pour le StudentName et les accolades les plus extérieures encadrent l’initialiseur pour la paire clé/valeur ajoutée à studentsDictionary<TKey,TValue>. Pour finir, l’initialiseur de collection entier pour le dictionnaire est placé entre accolades. Dans la deuxième initialisation, le côté gauche de l’affectation est la clé et le côté droit est la valeur, avec un initialiseur d’objet pour StudentName.

Voir aussi