[C#] Implémenter un OrderBy en C# 2

Bonjour à tous,

Je souhaiterais implémenter l’équivalent d’un « OrderBy » de Linq en C# 2.
Pour être un peu plus précis je souhaiterais pouvoir passer une collection dans une méthode qui trierait cette collection en fonction des propriétés passées également en paramètre. Quelque chose comme ça :

List<Employe> listEmployeTrieeParNom = CollectionHelper.OrderBy(listEmploye, "nom", "asc"). // nom étant une propriété de l'objet Employe

Est-ce que c’est possible ? Auriez-vous des liens ou des pistes (des éléments de réflexions m’irais très bien, si en plus je peux comprendre ce que j’écris plutôt que de faire de la repompre ce serait cool ^^)

Merci d’avance :slight_smile:

Si j’ai bien compris ce que tu veux, tu devrais pouvoir t’en sortir en créant un Comparer.

Oui, un IComparer ou implementer IComparable est la solution. Apres, tu peux aussi parametrer ledit comparer au moment de ton list.Sort(). Check dans la MSDN, tout y est.

Tout est quasiement toujours sur MSDN! (si on sait quoi chercher c’est le soucis hehe)

Merci beaucoup pour les liens :crying: Je regarderai ça ce soir !

Une petite précision toutefois. Je me suis mal exprimé en fait. Je voulais dire que la méthode en question puisse trier n’importe quelle liste d’objets (en gros IEnumerable) avec n’importe quelle propriété de l’objet de la collection. (remarque je ne sais pas si c’est beaucoup plus clair :slight_smile: ).

Genre :

[code]// 2 collections triées avec la même méthode…
List listEmployeTrieeParNom = CollectionHelper.OrderBy(listEmploye, « nom », « asc »). // nom étant une propriété de l’objet Employe

List listProduitsTrieeParPrix = CollectionHelper.OrderBy(listProduit, « prix », « desc »). // prix étant une propriété de l’objet Produit[/code]

C’est dans ce sens là où je disais que je voulais un OrderBy façon Linq…

La classe List contient la méthode Sort(IComparer) à laquelle tu vas passer ton comparer:

En fait c’est pas une méthode globale qui te permet de tout trier.
C’est plutôt une classe qui implémente un algo de tri (que tu défini comme tu veux) et qui trie les objets d’un même type (quoique en FW1 tu devais pouvoir lui passer tout et n’importe quoi mais problème de cast possible).
Donc tu devra en définir une pour trier tes employés (comme le montre l’exemple de Totoradio) et une pour tes produits.

Si tu veux faire un truc plus generique, avec par exemple un comparer qui va prendre des noms de champs pour le tri, tu risques de devoir passer par de la reflection, et ca peut devenir vite assez lent. Mefies toi donc, et evalue bien tes besoins afin de pas faire un truc ultragenerique qui te serviras 2x :slight_smile:

Avant de justement partir sur une méthode basée sur la Reflection, je te conseille de jeter un oeil sur cet article (et ses references), ou plus généralement de faire une recherche sur Reflection + Emit sur CodeProject.

En gros, quitte à faire de la Reflection, autant regarder la génération de code IL à la volée, qui donne des perfs bien plus acceptables.

Ouais, mais si il galere deja a faire un IComparer, jouer avec Emit risque d’etre assez chaud. Cependant, ca reste effectivement surement une des meilleures solutions.

Bonjour à tous !!! Merci pour toutes vos réponses… Je vais regarder ça à tête reposée ce week-end… En fait on m’a demandé de créer une méthode générique pour trier des collections afin de centraliser ça une bonne fois pour toute :slight_smile: , car plusieurs méthodes existent actuellement au sein des projets et font la même chose. A priori je pense que la méthode List.Sort en passant une méthode anonyme serait ce qu’il y a de « mieux » pour mon cas. Enfin je vous tiens au courant de toutes façons :wink:

Merci encore !!!

Ca marchera :slight_smile: Sinon, si tu es interessé par la reflection et l’emit, j’ai vu ces 2 posts ( ici et la ) sur le net recemment. Ca peut aider.

Bon, finalement la méthode Sort de liste me convient très bien :slight_smile: Faudrait que je crée un « comparer » qui puisse gérer quelques options de tri et ce sera OK. Merci pour tous ces liens !!!

Même le numéro de Kate Beckinsale? :slight_smile: