Tri d'un dictionnaire par valeur en C# : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi trier un dictionnaire par valeur est un casse-tête (et comment y remédier)

\n\n

Avez-vous déjà été confronté à cette situation : vous avez un Dictionary<string, int> avec des dizaines d'entrées, et vous devez les afficher par ordre décroissant de popularité ? Par exemple, une liste des mots les plus fréquents dans un texte ou le top 10 des produits par ventes. Cela semble être une tâche simple, mais le Dictionary standard en C# stocke les données dans un ordre arbitraire. Sur Stack Overflow, la question "How do you sort a dictionary by value?" a recueilli des milliers de vues – et ce n'est pas un hasard.

\n\n

Dans ce tutoriel, nous allons passer en revue toutes les méthodes légales pour trier un Dictionary par valeur en C# : de l'astuce LINQ simple à la création de votre propre dictionnaire ordonné. Vous découvrirez quelle méthode choisir pour des performances et une lisibilité maximales.

\n\n

Pourquoi un Dictionary ne se trie-t-il pas tout seul ?

\n\n

Avant de plonger dans le code, comprenons la nature du Dictionary<TKey, TValue>. Ce type de données est une table de hachage. Il est optimisé pour la recherche rapide par clé, et non pour stocker des éléments dans un ordre spécifique. Lorsque vous ajoutez un élément, il atterrit dans un « panier » basé sur le hachage de la clé. Aucun tri n'a lieu.

\n\n

Si vous avez besoin d'une sortie triée – vous devrez intervenir manuellement. Bonne nouvelle : C# propose plusieurs solutions élégantes.

\n\n

Méthode 1 : LINQ – la méthode la plus populaire (comme dans la réponse sur Stack Overflow)

\n\n

L'approche la plus simple et la plus courante consiste à utiliser LINQ et les méthodes OrderBy ou OrderByDescending. Cette option est idéale lorsque vous devez trier des données une seule fois pour les afficher ou les exporter.

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape", 1}\n};\n\n// Tri par valeur croissante\nvar sortedAsc = fruits.OrderBy(pair => pair.Value);\n\n// Tri par valeur décroissante\nvar sortedDesc = fruits.OrderByDescending(pair => pair.Value);\n\nConsole.WriteLine("Par ordre croissant :");\nforeach (var item in sortedAsc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}\n\nConsole.WriteLine("\\nPar ordre décroissant :");\nforeach (var item in sortedDesc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}
\n\n

Résultat :

\n
Par ordre croissant :\ngrape: 1\nbanana: 3\napple: 5\norange: 8\n\nPar ordre décroissant :\norange: 8\napple: 5\nbanana: 3\ngrape: 1
\n\n

Comment cela fonctionne-t-il ?

\n

OrderBy retourne un IOrderedEnumerable<KeyValuePair<string, int>> – une séquence qui est triée « paresseusement » (uniquement lors de la première itération). Ce n'est pas un nouveau dictionnaire, mais une projection. Si vous devez conserver le résultat, convertissez-le à nouveau en dictionnaire avec .ToDictionary().

\n\n

Important : ToDictionary crée un Dictionary standard qui, encore une fois, ne garantit pas l'ordre. Si l'ordre est crucial – utilisez SortedDictionary ou une liste de tuples.

\n\n

Méthode 2 : SortedDictionary – quand l'ordre est nécessaire en permanence

\n\n

Si vous prévoyez d'accéder fréquemment à des données triées, il est préférable d'utiliser SortedDictionary. Cette classe maintient automatiquement le tri par clé. Mais nous avons besoin d'un tri par valeur !

\n\n

Astuce : nous ne pouvons pas forcer SortedDictionary à trier directement par valeur. Mais nous pouvons utiliser SortedDictionary avec un comparateur personnalisé ou, plus simplement, créer une classe auxiliaire.

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape"                

Blogs

Book Recommendations