Icomparer pour dates

Signaler
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
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

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
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;
}
}
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Voui, en .NET 2, on préféreras tout de même utilisé IComparer< >

<hr size="2" />VC# forever
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

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)'
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Un petite correction serait la bienvenue :)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
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
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
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?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
D'ailleurs, y'a un blog qui vient de publier un article intéressant à ce sujet

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