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 entourent l’initialiseur d’objet pour le StudentName
et les accolades les plus extérieures entourent l’initialiseur pour la paire clé/valeur à ajouter au Dictionary<TKey,TValue> students
. 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
.