Icomparer pour dates

Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014 - 20 sept. 2006 à 15:00
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 27 sept. 2006 à 10:02
Salut !

J'aurais besoin d'un coup de pouce.
J'ai déja posté une question hier pour organiser un datagrid contenant des nombres.
Mais aujourd'hui ce sont des dates que j'ai besoin d'organiser.

J'ai donc un datagridview qui contient des dates (sous forme de chaine de 10 caractères) dans sa première colonne. J'ai besoin de les avoir dans l'ordre contre-chronologique (de la plus récente à la plus ancienne).
quelqu'un peut t'il me faire un exemple avec dataGridView.Sort(Icomparer)
Un exemple me suffira pour comprendre je pense, parce que mon avis est que c'est très mal expliqué dans le msdn. J'ai rien saisi.

Merci d'avance !

MMN

8 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
20 sept. 2006 à 17:23
tu dois écrire une classe qui implémente IComparer

private class MaClasseComparer : IComparer
{

}

en clickant sur IComparer, un petit trait rouge apparait dessous (ou bleu, je sais plus, du moins si tu utilise visual studio).
cela va te créer les méthodes a implémenter (la méthode compare uniquement).
cette méthode.
cette méthode doit renvoyer une valeur qui obéis aux critères suivant :

Inférieure à zéro
x est inférieur à y.

Zéro
x est égal à y.

Supérieure à zéro
x est supérieur à y.

ensuite, a toi de créer un constructeur qui te convient afin de pouvoir instancier l'objet que tu passeras en paramètre de la méthode sort.

par exemple tu veux que ton comparer puisse comparer deux int (tout simplement) :

private class MonComparer : IComparer
{
public MonComparer()
{}

public int Compare(object x, object y)
{
//retourne la différence entre x et y, donc un nombre qui corresponde aux critères cités ci dessus.
return x - y;
}
}
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
20 sept. 2006 à 21:40
Voui, en .NET 2, on préféreras tout de même utilisé IComparer< >

<hr size="2" />VC# forever
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
21 sept. 2006 à 10:26
Voila ce que j'ai fait :


class MonComparer : IComparer
{
public MonComparer()
{ }
public int CompareDates(object x, object y)
{
DateTime A = System.Convert.ToDateTime(x);
DateTime B = System.Convert.ToDateTime(y);
if (A.Year < B.Year)
return 1;
else if (A.Year == B.Year)
{
if (A.Month < B.Month)
return 1;
else if (A.Month == B.Month)
{
if (A.Day < B.Day)
return 1;
else if (A.Day == B.Day)
{
return 0;
}
else return -1;
}
else return -1;
}
else return -1;
}

Je l'utilise comme suit :

dataHistorique.Sort(new MonComparer().CompareDates(SortOrder.Descending));

et voila l'erreur que j'ai :

'MonComparer' does not implement interface member 'System.Collections.IComparer.Compare(object, object)'
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
21 sept. 2006 à 10:27
Un petite correction serait la bienvenue :)
0

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

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
21 sept. 2006 à 13:10
Faut mettre dataHistorique.Sort(new MonComparer());
Mais utiliser Comparer< > est bien plus indiqué, comme je l'ai noté quelques postes plus haut...

<hr size="2" />VC# forever
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
21 sept. 2006 à 13:39
pour implémenter l'interface, les noms de méthodes doivent etre RIGOUREUSEMENT identiques a ceux définits dans linterface...en bref, "CompareDate" est a remplacer par "Compare"....tu ne crée pas ta propre méthode, tu implémente la méthode définie dans l'interface....

@Bidou : pourquoi plutot Comparer <>? il ne va pas utiliser la généricité vu que sa comparaison est assez spécifique...ca a un autre intéret que la généricité et implémenter une seule fois linterface pour plusieurs algorithmes de comparaison?
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
21 sept. 2006 à 15:24
leprov>

class MonComparer : IComparer   => class MonComparer : IComparer<DateTime>
public int Compare(object x, object y) => public int Compare(DateTime dt1, DateTime dt2)

Pas de cast nécessaire !

<hr size="2" />VC# forever
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
27 sept. 2006 à 10:02
D'ailleurs, y'a un blog qui vient de publier un article intéressant à ce sujet

<hr size="2" />VC# forever
0