Comment trier List<T> par propriété d'objet en C# : guide complet

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

Tri de List<T> en C# : du chaos à l'ordre en 5 minutes

\n\n

Imaginez : 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\n

Dans 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\n

Ce que nous allons trier : la classe User

\n\n

Pour les exemples, prenons un modèle de données simple — un utilisateur avec un nom, un âge et une note.

\n\n
public 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\n

Créons une liste de test :

\n\n
List<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\n

Méthode 1 : LINQ OrderBy — la plus simple et élégante

\n\n

Si 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.

\n\n
// 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\n

Avantages : lisibilité, chaînes de tris, fonctionne avec tout type de propriété.
\nInconvénients : crée une nouvelle liste (mémoire supplémentaire).

\n\n

Méthode 2 : List.Sort avec le délégué Comparison — tri sur place

\n\n

Si 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.

\n\n
// 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\n

Avantages : ne crée pas de nouvel objet, plus rapide pour les grandes listes.
\nInconvénients : moins lisible pour un tri complexe.

\n\n

Méthode 3 : Implémentation de IComparable — tri « prêt à l'emploi »

\n\n

Si 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.

\n\n
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\n

Avantages : 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.

\n\n

Méthode 4 : IComparer — un tri flexible

Blogs

Book Recommendations