cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 27 sept. 2006 à 10:56
Exemple :
public
class
MyComparer : System.Collections.
IComparer
{
public
int Compare(
object o1,
object o2)
{
// Supposons que tu veux trier des chiens pas ordre d'âge :
if (((
Chien)o1).Age > ((
Chien)o2).Age)
return 1;
else
if (((
Chien)o2).Age > ((
Chien)o1).Age)
return -1;
else
return 0;
}
}
Pour faire bien faudrait faire des tests pour être sur que l'object est bien un Chien. Ou encore mieux, tu implémentes IComparer< > au lieu de IComparer.
enigmatiqk
Messages postés39Date d'inscriptionmercredi 18 juin 2003StatutMembreDernière intervention 9 mars 2010 27 sept. 2006 à 12:01
et bien franchement, merci infiniement bidou, sans toi, je n'aurais jamais reussi !!!
je donne le code, si besoin pour d'autres personnes comme moi:
arraylist list = new arraylist();
string[] str = new string[3];
string[] str2 = new string[3];
[...] je rempli pli str[0],str[1], etc
list.add(str);
[...] je rempli pli str2[0],str[1], etc list.add(str2);
IComparer myComparer = new comparAL();
arr.Sort(myComparer);
//class comparAL
using System;
using System.Collections;
public class comparAL : IComparer
{
public int Compare(object o1, object o2)
{
int res;
res = (((string[])o1)[0]).CompareTo(((string[])o2)[0]);
//apres avoir comparé la 1ere colonne, si elle est à égalité
//alors on recommence avec la 2eme colonne
if(res == 0)
{
res = (((string[])o1)[1]).CompareTo(((string[])o2)[1]);
}
/* //à utiliser si il s'agit d'un tableau de chiffres if ( ((string[])o1)[0] > ((string[])o2)[0] ) return 1;
else if (((string[])o1)[0] < ((string[])o2)[0]) return -1;
else if (((string[])o1)[1] > ((string[])o2)[1]) return 1;
else if (((string[])o1)[1] < ((string[])o2)[1]) return -1;
*/
MoDDiB
Messages postés546Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention 4 mai 20071 26 sept. 2006 à 18:10
Si tu utilises une arrayList qui ne contient qu'un type de donnée il vaut mieux utiliser les générics ( pour des raisons de performances et de sécurités pour le programmeur ).
Pour créer ta liste de string procède ainsi :
List<String> list = new List<string>();
Pour ajouter des chaines dedans :
list.Add("chaine");
et pour trier list.Sort() est suffisant. ( je ne vois pas ce que tu entends pas colonne dans un string...)
Mais si tu veux faire ta propre opération de tri il faudra faire list.Sort( ) mais avec un IComparer en argument : je t'invites à consulter la MSDN pour comprendre le fonctionnement c'est très bien expliquer.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 26 sept. 2006 à 22:24
Si tu veux faire un sort cutomizé, il suffit de créer une class qui implémenter IComparer et d'implémenter sa méthode public int Compare(object o1, object 02).
Tu peux aussi utiliser IComparer< >.
<hr size="2" />VC# forever
Vous n’avez pas trouvé la réponse que vous recherchez ?
enigmatiqk
Messages postés39Date d'inscriptionmercredi 18 juin 2003StatutMembreDernière intervention 9 mars 2010 27 sept. 2006 à 09:12
merci, je vais essayer de me debrouiller avec ce que vous me dite.
moddib> par tableau de string, j'entend ca: string[] var = new string[6];
ton idée List<String> list = new List<string>();
list.Add("chaine");
ca ne me vas pas du tout, car j'ai besoin de stocker 6 colonnes ... à moins que tu me donne 1 tableau 2dimensions dynamique...
bidou >merci c'est à peu pres ce que je veux, mais comme je l'ai signalé, j'ai déjà vu tt ca, mais je capte pas comment l'utilisé.., je vais essayer, dit moi si je suis sur la bonne voie:
arraylist2 list = new arraylist2();
string[] str = new string[3];
[...] je rempli pli str[0],str[1], etc
list.add(str);
[...]
list.add(str);
ensuite je creer une classe arraylist2 qui hérite de arraylist
public int compare(object o1,object o2)
{
if(o1[0] < o2[0])
{
return -1;
}else{
if(o1[0] > o2[0])
{
return 1;
}
}
return 0;
}
(apres pour trier sur deux colonnes, je complique les conditions...)
enigmatiqk
Messages postés39Date d'inscriptionmercredi 18 juin 2003StatutMembreDernière intervention 9 mars 2010 27 sept. 2006 à 10:13
bidou>
Tu n'as pas bien compris comment ça marche apparement ;-) => exactement, d'où mon post ^^
j'ai essayer avec ton dernier post, mais c'est pas gagné, voici ce que j'ai fait
using System;
using System.Collections;
public class ComparAL : Comparer
{
public ComparAL() {}
public int Compare(object o1, object o2)
{
int res;
res = o1[0].CompareTo(o2[0]);
if(res == 0)
{
res = o1[1].CompareTo(o2[1]);
}
return res;
}
}
mais a la compil il me dit:
'maj_structure.ComparAL' : cannot inherit from sealed class 'System.Collections.Comparer'
et puis je sais pas si je doit mettre:
public int Compare(object o1, object o2) ou
public int Compare(object[] o1, object[] o2) ou
public int Compare(string[] o1, string[] o2)
enigmatiqk
Messages postés39Date d'inscriptionmercredi 18 juin 2003StatutMembreDernière intervention 9 mars 2010 27 sept. 2006 à 11:15
ben écoute, jme suis pri la tete car ca ne marchai pas, alors au final, j'ai supprimer la class, et j'en ai refaite une nouvelle, et la ca marche.
par contre, j'ai tjr le mm pb:
je sais pas si je doit mettre:
public int Compare(object o1, object o2) ou
public int Compare(object[] o1, object[] o2) ou
public int Compare(string[] o1, string[] o2)
ne pas oublier ce que je compare:
arraylist list = new arraylist();
string[] str = new string[3];
[...] je rempli pli str[0],str[1], etc
list.add(str);
[...] je rempli pli str[0],str[1], etc list.add(str);