Array.Sort()

engelho Messages postés 115 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 2 août 2005 - 9 mai 2005 à 10:31
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...

15 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 mai 2005 à 10:49
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
9 mai 2005 à 10:58
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>
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 mai 2005 à 11:05
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
9 mai 2005 à 11:05
mais de rien

Sébastien FERRAND

Blog :
http://blogs.developpeur.org/sebmafate</FO< body>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
9 mai 2005 à 11:11
Les liens qui vont bien :-)
IComparer
IComparer.Compare

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
engelho Messages postés 115 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 2 août 2005
9 mai 2005 à 13:10
euh...

c'est moi qui ne comprend pas???

Comment ces fonctions peuvent m'aider???
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 mai 2005 à 15:16
0
engelho Messages postés 115 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 2 août 2005
9 mai 2005 à 15:34
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 ;)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 mai 2005 à 05:28
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 )
0
engelho Messages postés 115 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 2 août 2005
10 mai 2005 à 08:19
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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
10 mai 2005 à 08:52
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
0
engelho Messages postés 115 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 2 août 2005
10 mai 2005 à 13:31
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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
10 mai 2005 à 13:53
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
0
engelho Messages postés 115 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 2 août 2005
10 mai 2005 à 14:16
Ok d'accord.

merci.
0
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
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.
0
Rejoignez-nous