Les dictionnaires en C# : pourquoi c'est important et comment les utiliser ?
\n\nImaginez que vous êtes bibliothécaire. Vous avez des milliers de livres et vous devez en trouver un spécifique en une seconde. Allez-vous parcourir tous les livres un par un ? Non, vous utiliseriez un catalogue. Le dictionnaire (Dictionary) en C# est exactement ce catalogue. Il stocke des paires "clé-valeur" et permet d'obtenir instantanément des données par clé.
\n\nMais que faire lorsque vous devez non pas trouver une seule entrée, mais traiter tout le contenu du dictionnaire ? Par exemple, afficher tous les paramètres d'une application, calculer le total d'un panier d'achat en ligne ou sérialiser des données en JSON. C'est là que se pose la question classique : "How to iterate over a dictionary?".
\n\nSur Stack Overflow, cette question a recueilli des milliers de vues. Et ce n'est pas sans raison : apparemment, quoi de plus simple ? Mais les débutants butent souvent sur les types de données, et les experts sur les performances. Dans cet article, nous allons analyser toutes les méthodes d'itération sur un dictionnaire en C# : du simple foreach au LINQ avancé. C'est parti !
1. Les bases : structure du Dictionary en C#
\n\nAvant d'itérer, rappelons à quoi ressemble un dictionnaire C#. Il s'agit d'une collection générique de l'espace de noms System.Collections.Generic.
Dictionary<string, int> ages = new Dictionary<string, int>()\n{\n { "Анна", 25 },\n { "Борис", 30 },\n { "Виктор", 35 }\n};\n\nChaque élément du dictionnaire est une structure KeyValuePair<TKey, TValue>. Elle possède deux propriétés : Key et Value. C'est avec cette paire que nous allons travailler lors du parcours.
2. La classique : foreach sur un dictionnaire
\n\nLa méthode la plus courante pour itérer sur un dictionnaire C# est la boucle foreach. Elle est concise, lisible et sécurisée.
foreach (KeyValuePair<string, int> kvp in ages)\n{\n Console.WriteLine($"{kvp.Key}: {kvp.Value} ans");\n}\n\nRésultat :
\nАнна: 25 ans\nБорис: 30 ans\nВиктор: 35 ans\n\nNotez que kvp est un KeyValuePair. N'essayez pas de modifier la clé ou la valeur à l'intérieur de la boucle — le dictionnaire deviendrait incohérent et vous obtiendriez une exception InvalidOperationException.
Conseil de pro : Si vous avez la flemme d'écrire le type complet, utilisez var :
foreach (var kvp in ages) { ... }\n\n3. Uniquement les clés ou uniquement les valeurs
\n\nParfois, nous n'avons pas besoin de la paire entière. Par exemple, il suffit d'afficher la liste de toutes les clés (noms) ou de toutes les valeurs (âges). Pour cela, le dictionnaire possède les propriétés Keys et Values.
Itération sur les clés
\nforeach (string name in ages.Keys)\n{\n Console.WriteLine($"Nom : {name}");\n}\n\nItération sur les valeurs
\nforeach (int age in ages.Values)\n{\n Console.WriteLine($"Âge : {age}");\n}\n\nC'est plus rapide que d'obtenir un KeyValuePair si vous n'avez pas besoin de la seconde partie. De plus, le code devient plus propre.
4. Accès par index : for et ElementAt
\n\nDe nombreux débutants essaient d'utiliser for (int i = 0; i < dict.Count; i++). Mais le Dictionary en C# ne supporte pas l'indexation par numéro ! Tenter d'écrire dict[i] entraînera une erreur de compilation.
Cependant, on peut contourner le problème : obtenir la collection de paires via .ToList() et y accéder par index.
var list = ages.ToList();\nfor (int i = 0; i < list.Count; i++)\n{\n Console.WriteLine($"{list[i].Key}: {list[i].Value}");\n}\n\nInconvénients :
\n- \n
- Une copie supplémentaire des données est créée (mémoire + temps). \n
- Le sens du dictionnaire en tant que tableau associatif est perdu. \n
Cette méthode ne doit être utilisée que si vous avez absolument besoin d'un index (par exemple, pour un traitement parallèle avec division en parties).
\n\n