OVH Cloud OVH Cloud

Icomparer

2 réponses
Avatar
Sylo
Je dois manipuler une classe qui implements icomparer
Mais je ne sais pas comment cela fonctionne
Quelqu'un pourrait-il me donner un lien

(en fait, dans janus.gridex, je dois donner un objet icomparer a une colonne
pour que quand je groupe sur cette colonne, cela ne se fasse que sur les
deux premiers caractères)

MErci
Sylvain

2 réponses

Avatar
Ambassadeur Kosh
un IComparer permet de comparer deux objets (un ordre)

int Compare(object x, object y);

resultat < 0 |- x < y
resultat == 0 |- x equal y
resultat > 0 |- x > y

il y'a plein de façon d'établir un ordre. il y'a celui sur les entiers, sur
les nombres, sur les chaine, celui sur les lignes d'une table (ou on compare
un champ, puis un autre)...

par contre, si tu as besoin d'une comparaison qui te dit "==" ou "!=", il
est plus que recommandé d'utiliser IEqualityComparer

si tu peux utiliser les versions generic IComparer<T> ou
IEqualityComparer<T>, c'est carrement bien.

enfin, dans le comparateur, il y'a toujours le cas chiant ou on a un des
deux champs qui n'est pas du même type que l'autre, ou qui est null...
inferieur ? superieur ? egal ? renvoyer une exception ?
eh ben ça dépend de ce qu'on attend.

voici une implantation classique (reflector sur Comparer). le pb de types
est rejeté sur IComparable, c'est domage, mais c'est un exemple

public int Compare(object a, object b)
{
if (a == b)
{
return 0;
}
if (a == null)
{
return -1;
}
if (b == null)
{
return 1;
}
if (this.m_compareInfo != null)
{
string text1 = a as string;
string text2 = b as string;
if ((text1 != null) && (text2 != null))
{
return this.m_compareInfo.Compare(text1, text2);
}
}
IComparable comparable1 = a as IComparable;
if (comparable1 == null)
{
throw new
ArgumentException(Environment.GetResourceString("Argument_ImplementIComparable"));
}
return comparable1.CompareTo(b);
}

donc, typiquement, ton comparateur va recevoir deux zones de texte, et toi,
tu vas simplement faire un SubString des deux premiers caracteres de
chacune, et retourner le CompareTo puisque ce sont deux chaines. (attention
à la culture si ça a un impact)
Avatar
Omega
Tu crée une class qui implémente Icomparer
Public Class test

Implements IComparer

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer
Implements System.Collections.IComparer.Compare

End Function

End Class

Puis tu implemente la fonction Compare. Cette fonction sera appelé pour
comparer chaque element 2 à 2
donc si tu as tu texte dans ta colonne, x et y sont de type texte, tu n'a
plus qu'a faire leur comparaison.
Voila un exemple pour 2 objet de type Numeric
If (x< y)Then

return = -1

ElseIf (x > y)Then

return = 1

Else

return = 0

End If


--

"Sylo" <devbnet@[antispam]free.fr> a écrit dans le message de
news:
Je dois manipuler une classe qui implements icomparer
Mais je ne sais pas comment cela fonctionne
Quelqu'un pourrait-il me donner un lien

(en fait, dans janus.gridex, je dois donner un objet icomparer a une


colonne
pour que quand je groupe sur cette colonne, cela ne se fasse que sur les
deux premiers caractères)

MErci
Sylvain