Array.Sort()

Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
- - Dernière réponse : engelho
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
- 13 mai 2005 à 16:34
Bonjour,

Je possède un un tableau que je souhaite trier. Toutefois ce tableau comprend des objets...

J'ai implémenté la fonction CompareTo().

Mais je me demande si je peux utiliser Array.Sort() et passer une variable de mon objet en argument (du genre Array.Sort(monObjet.MaVariable);), ou si je dois ré-écrire une fonction de tri complète dans mon objet...
Afficher la suite 

15 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43
0
Merci
Salut,
Une idée est de créer une class qui dérive de l'interface IComparer, d'y implémenter la fonction de tris 'bool Compare(object o1, object o2)' et ensuite de créer une instance de cette classe qui tu passeras à la méthode Sort de ton Array.
C'est une solution assez élégante

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
euh... Bidou... dans l'interface IComparer, la méthode Compare a pour prototype :
int Compare(object o1, object o2);

tu retournes :
-1 si o1 < o2
0 si o1 = o2
1 si o1 > o2

Sébastien FERRAND

Blog :
http://blogs.developpeur.org/sebmafate</FO< body>
Commenter la réponse de sebmafate
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43
0
Merci
Effectivement, je me suis trompé. J'ai des problèmes de mémoires
Merci d'avoir corrigé ;-)

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
mais de rien

Sébastien FERRAND

Blog :
http://blogs.developpeur.org/sebmafate</FO< body>
Commenter la réponse de sebmafate
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
0
Merci
Les liens qui vont bien :-)
IComparer
IComparer.Compare

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
0
Merci
euh...

c'est moi qui ne comprend pas???

Comment ces fonctions peuvent m'aider???
Commenter la réponse de engelho
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43
0
Merci
Pour savoir comment les utiliser, jette un oeil ici :

http://www.c2i.fr/code.aspx?IDCode=559
http://www.c2i.fr/code.aspx?IDCode=561

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
0
Merci
Décidément, je dois être allergique... lol.

Plus sérieusement, je n'ai pas tout suivi... euh... en implémentant compareTo ou compare, mes objets seront triés automatiquement????

euh... et si moi, je veux pouvoir trier un coup sur un paramètres, et un coup sur un autre (changer de tris en cour de route quoi), il me suffit de créer plusieurs fonction compareTo????

ca serait magique... malheureusement, j'ai passé l'age de croire a la magie...

désolé, ça devient presque trop facile pour cerveau détraqué, et je n'arrive pas à tous suivre ;)
Commenter la réponse de engelho
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
0
Merci
Si tu as le code source de la classe des objets a tries, tu implementes l'interface Icomparable, puis tu appelles Array.Sort( Array ) qui utilisera ta nouvelle implementation, chaque elements sera compares avec ta propre definition de IComparable.CompareTo( Object )


Si tu n'a pas le code soure, tu implementes une nouvelle classe qui derive de IComparer, puis tu appelles Array.Sort( Array, Icomparer ) chaques elements du tableau sera compares avec Icomparer.Compare( Object, Object )


Pour changer de tri en cours de route y'a toujours Array.Reverse( Array ) ou alors c'est dans ta methode CompateTo( Object ) ou Compare( Object, Object ) que tu definis des conditions pour ne pas avoir toujours le meme ordre de tri, selon une variable "globale" par exemple que tu redefinis avant chaque appelle a Array.Sort( Array )
Commenter la réponse de Lutinore
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
0
Merci
Ca y est, j'ai compris! eurêka!

merci beaucoup.

Allez, une dernière question juste pour la route... Enfin, c'est plus une confirmation...

Je suppose que si ma classe hérite de Icomparer (ou icomparable), il m'est impossible de surcharger directement la fonction sort (qui semble appartenir a la classe array)...

J'ai bon?

encore merci.
Commenter la réponse de engelho
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43
0
Merci
Euh si c'est possible, mais à priori ça ne semble pas utile puisque la méthode Sort en elle-même ne fait rien, si ce n'est appelé la méthode Compare de l'interface qui contient toute la logique...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
0
Merci
Ah c'est possible? alors je vous expose une idée, et vous me dites si c'est pas trop con....

Et si je surcharge cette fonction, en lui mettant un variable qui permet de choisir sur quels paramètre je tri mes arrays??? bon, je pensais limiter ça a quelques valeurs prédéfinies (façon enum), mais ca pourrais simplifier les choses....

Parce que je veux permettre a la personne qui visite le site de trier les données d'un datagrid en cliquant sur l'en-tête (entre autre tri possibles), donc, ca serait sympa d'utiliser la même fonction en changeant un paramètre...

enfin je crois.... lol.
Commenter la réponse de engelho
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43
0
Merci
Oui bien sur, voici un exemple que j'avais fait en ajoutant une méthode sort à une collection que j'avais construite (SortType est justement un enum et DateSorter/TitleSorter des classes qui implémentent la méthode Compare ) :

public void Sort(SortType sort, bool ascending)
{
if(sort == SortType.Date)
{
if(ascending) this.InnerList.Sort(new DateSorter(true));
else this.InnerList.Sort(new DateSorter(false));
}
else if(sort == SortType.Title)
{
if(ascending) this.InnerList.Sort(new TitleSorter(true));
else this.InnerList.Sort(new TitleSorter(false));
}
}

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
0
Merci
Ok d'accord.

merci.
Commenter la réponse de engelho
Messages postés
115
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
2 août 2005
0
Merci
Oui, bon, je sais, ca commence a dater... mais j'ai eut une semaine chargée, et je viens seulement de me rendre compte....

bidou, ta surcharge de la fonction sort, tu l'as faite dans un objet qui te servait de collection, c'est bien ça??

Si c'est ça, ca ne vas pas pour ce que je voulais faire....

je tri un Array tout ce qu'il y a de plus banal (et en fait, je ne peux pas trop me permettre d'y toucher). Quand je parlais de surcharger sort(); je voulais dire dans l'objet qui implémente icomparable....

Merci quand même pour tout ces efforts.
Commenter la réponse de engelho