Tri de List<T> en C# : du chaos à l'ordre en 5 minutes
\n\nImaginez : vous avez une liste d'utilisateurs et vous devez les afficher par ordre alphabétique du nom de famille. Ou une liste de produits à trier par prix du moins cher au plus cher. Une tâche familière ? Sur Stack Overflow, la question « How to Sort a List<T> by a property in the object » a recueilli des milliers de vues — ce qui montre que ce sujet préoccupe de nombreux développeurs.
\n\nDans cet article, nous allons examiner cinq méthodes pour trier une liste en C#. Vous apprendrez à trier par une seule propriété, par plusieurs champs, et aussi à rendre le tri le plus rapide possible. C'est parti !
\n\nCe que nous allons trier : la classe User
\n\nPour les exemples, prenons un modèle de données simple — un utilisateur avec un nom, un âge et une note.
\n\npublic class User\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public double Rating { get; set; }\n\n public override string ToString()\n {\n return $"{Name} ({Age}) — {Rating:F2}";\n }\n}\n\nCréons une liste de test :
\n\nList<User> users = new List<User>\n{\n new User { Name = "Анна", Age = 30, Rating = 4.5 },\n new User { Name = "Борис", Age = 25, Rating = 3.8 },\n new User { Name = "Виктор", Age = 35, Rating = 4.9 },\n new User { Name = "Галина", Age = 28, Rating = 4.2 }\n};\n\nMéthode 1 : LINQ OrderBy — la plus simple et élégante
\n\nSi vous voulez trier List<T> par propriété d'objet rapidement et sans code superflu — utilisez LINQ. La méthode OrderBy crée une nouvelle séquence ordonnée sans modifier la liste d'origine. C'est idéal lorsqu'un tri « à la volée » est nécessaire.
// Tri par nom (ordre croissant)\nvar sortedByName = users.OrderBy(u => u.Name).ToList();\n\n// Tri par âge (ordre décroissant)\nvar sortedByAgeDesc = users.OrderByDescending(u => u.Age).ToList();\n\n// Tri par plusieurs champs : d'abord par âge, puis par note\nvar sortedMulti = users\n .OrderBy(u => u.Age)\n .ThenBy(u => u.Rating)\n .ToList();\n\nAvantages : lisibilité, chaînes de tris, fonctionne avec tout type de propriété.
\nInconvénients : crée une nouvelle liste (mémoire supplémentaire).
Méthode 2 : List.Sort avec le délégué Comparison — tri sur place
\n\nSi vous devez trier une liste C# sans créer de copie (économie de mémoire), utilisez la méthode Sort avec une expression lambda. Cette méthode modifie la collection d'origine.
// Tri par nom (sur place)\nusers.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));\n\n// Tri par âge (ordre décroissant)\nusers.Sort((a, b) => b.Age.CompareTo(a.Age));\n\n// Tri par note\nusers.Sort((a, b) => a.Rating.CompareTo(b.Rating));\n\nAvantages : ne crée pas de nouvel objet, plus rapide pour les grandes listes.
\nInconvénients : moins lisible pour un tri complexe.
Méthode 3 : Implémentation de IComparable — tri « prêt à l'emploi »
\n\nSi votre classe doit toujours être triée par le même champ (par exemple, le nom), implémentez l'interface IComparable<T>. Alors List.Sort() fonctionnera sans arguments.
public class User : IComparable<User>\n{\n // ... propriétés de l'exemple ci-dessus ...\n\n public int CompareTo(User other)\n {\n if (other == null) return 1;\n return string.Compare(this.Name, other.Name, StringComparison.Ordinal);\n }\n}\n\n// Utilisation\nusers.Sort(); // automatiquement par nom\n\nAvantages : tri naturel pour la logique métier.
\nInconvénients : définit une seule règle de manière rigide — pour d'autres champs, il faudra écrire une logique séparée.