OVH Cloud OVH Cloud

CompareTo()

4 réponses
Avatar
Denis
Bonjour à tous, voici ma question du jour.

J'ai une collection d'objet, chaque objet représentant un site.
Un site, c'est :
un ID, le Nom, et 2 champs booleens.

Je charge ma collection à partir d'une requete SQL triée sur le nom.

Ma collection est liée à un datasource d'un datagrid.

Jusque là, tout va bien.

Lorsque j'ajoute un site via une interface se saisie, je souhaite retrouver
ma collection triée sur le nom du site.

J'ai donc fait tout ce qu'il me semble nécessaire de faire dans ma
collection pour trier mais objets

public class CollectionSites : CollectionBase
{
public void SortByName()
{
InnerList.Sort(new NameComparer());
}

private class NameComparer : IComparer
{
public int Compare(object x,object y)
{

Sites sX = x as Sites;
Sites sY = y as Sites;
int retour = sX.SiteName.CompareTo(sY.SiteName);
return 0;
}
}
}

mais pas de bol, mais objets se retrouve triés par ordre de bordel presque
aléatoire.

En mettant un messagebox dans le Compare pour me retourner le nom de chaque
site en comparaison, la valeur retournée par CompareTo (-1,0 ou 1) correspond
bien à ce qui est attendu.

Par exemple, si je saisi ceci :
MB15,X,BC,AKZ,N,ZY,XZ
j'obtient toujours cela
N,BC,XZ,MB15,X,AKZ,ZY
au lieu de cela
AKZ,BC,MB15,N,X,XZ,ZY

C'est quoi ce tri ?

Aloha, 2nis

4 réponses

Avatar
Zim
Et si au lieu du return 0, vous mettiez return retour ?

Cordialement,
Zim.

Denis a écrit :
Bonjour à tous, voici ma question du jour.

J'ai une collection d'objet, chaque objet représentant un site.
Un site, c'est :
un ID, le Nom, et 2 champs booleens.

Je charge ma collection à partir d'une requete SQL triée sur le nom.

Ma collection est liée à un datasource d'un datagrid.

Jusque là, tout va bien.

Lorsque j'ajoute un site via une interface se saisie, je souhaite retrouver
ma collection triée sur le nom du site.

J'ai donc fait tout ce qu'il me semble nécessaire de faire dans ma
collection pour trier mais objets

public class CollectionSites : CollectionBase
{
public void SortByName()
{
InnerList.Sort(new NameComparer());
}

private class NameComparer : IComparer
{
public int Compare(object x,object y)
{

Sites sX = x as Sites;
Sites sY = y as Sites;
int retour = sX.SiteName.CompareTo(sY.SiteName);
return 0;
}
}
}

mais pas de bol, mais objets se retrouve triés par ordre de bordel presque
aléatoire.

En mettant un messagebox dans le Compare pour me retourner le nom de chaque
site en comparaison, la valeur retournée par CompareTo (-1,0 ou 1) correspond
bien à ce qui est attendu.

Par exemple, si je saisi ceci :
MB15,X,BC,AKZ,N,ZY,XZ
j'obtient toujours cela
N,BC,XZ,MB15,X,AKZ,ZY
au lieu de cela
AKZ,BC,MB15,N,X,XZ,ZY

C'est quoi ce tri ?

Aloha, 2nis


Avatar
Faust
voire directement

return sX.SiteName.CompareTo(sY.SiteName);

/_Zim_ a prétendu/ :
Et si au lieu du return 0, vous mettiez return retour ?

Cordialement,
Zim.

Denis a écrit :
Bonjour à tous, voici ma question du jour.

J'ai une collection d'objet, chaque objet représentant un site.
Un site, c'est :
un ID, le Nom, et 2 champs booleens.

Je charge ma collection à partir d'une requete SQL triée sur le nom.

Ma collection est liée à un datasource d'un datagrid.

Jusque là , tout va bien.

Lorsque j'ajoute un site via une interface se saisie, je souhaite retrouver
ma collection triée sur le nom du site.

J'ai donc fait tout ce qu'il me semble nécessaire de faire dans ma
collection pour trier mais objets

public class CollectionSites : CollectionBase
{
public void SortByName()
{
InnerList.Sort(new NameComparer());
}

private class NameComparer : IComparer
{
public int Compare(object x,object y)
{

Sites sX = x as Sites;
Sites sY = y as Sites;
int retour =
sX.SiteName.CompareTo(sY.SiteName);
return 0;
}
}
}

mais pas de bol, mais objets se retrouve triés par ordre de bordel presque
aléatoire.

En mettant un messagebox dans le Compare pour me retourner le nom de chaque
site en comparaison, la valeur retournée par CompareTo (-1,0 ou 1)
correspond bien à ce qui est attendu.

Par exemple, si je saisi ceci :
MB15,X,BC,AKZ,N,ZY,XZ
j'obtient toujours cela
N,BC,XZ,MB15,X,AKZ,ZY
au lieu de cela
AKZ,BC,MB15,N,X,XZ,ZY

C'est quoi ce tri ?

Aloha, 2nis





--
*/Teträm/*
http://www.tetram.info

"Avale tout sans réfléchir, ce qui n'est pas commestible resortira
toujours" - Proverbe Troll
Avatar
Denis
Merci à vous deux, ca fonctionne mieux ainsi !
L'erreur était tellement grosse, shame on me !!

Par contre, puisque je forcais le retour à 0 (donc objets identiques)
pourquoi ne restaient-ils pas classé dans le même ordre ? mystère.


Aloha, 2nis

"Faust" wrote:

voire directement

return sX.SiteName.CompareTo(sY.SiteName);

/_Zim_ a prétendu/ :
> Et si au lieu du return 0, vous mettiez return retour ?
>
> Cordialement,
> Zim.
>
> Denis a écrit :
>> Bonjour à tous, voici ma question du jour.
>>
>> J'ai une collection d'objet, chaque objet représentant un site.
>> Un site, c'est :
>> un ID, le Nom, et 2 champs booleens.
>>
>> Je charge ma collection à partir d'une requete SQL triée sur le nom.
>>
>> Ma collection est liée à un datasource d'un datagrid.
>>
>> Jusque là , tout va bien.
>>
>> Lorsque j'ajoute un site via une interface se saisie, je souhaite retrouver
>> ma collection triée sur le nom du site.
>>
>> J'ai donc fait tout ce qu'il me semble nécessaire de faire dans ma
>> collection pour trier mais objets
>>
>> public class CollectionSites : CollectionBase
>> {
>> public void SortByName()
>> {
>> InnerList.Sort(new NameComparer());
>> }
>>
>> private class NameComparer : IComparer
>> {
>> public int Compare(object x,object y)
>> {
>>
>> Sites sX = x as Sites;
>> Sites sY = y as Sites;
>> int retour =
>> sX.SiteName.CompareTo(sY.SiteName);
>> return 0;
>> }
>> }
>> }
>>
>> mais pas de bol, mais objets se retrouve triés par ordre de bordel presque
>> aléatoire.
>>
>> En mettant un messagebox dans le Compare pour me retourner le nom de chaque
>> site en comparaison, la valeur retournée par CompareTo (-1,0 ou 1)
>> correspond bien à ce qui est attendu.
>>
>> Par exemple, si je saisi ceci :
>> MB15,X,BC,AKZ,N,ZY,XZ
>> j'obtient toujours cela
>> N,BC,XZ,MB15,X,AKZ,ZY
>> au lieu de cela
>> AKZ,BC,MB15,N,X,XZ,ZY
>>
>> C'est quoi ce tri ?
>>
>> Aloha, 2nis

--
*/Teträm/*
http://www.tetram.info

"Avale tout sans réfléchir, ce qui n'est pas commestible resortira
toujours" - Proverbe Troll




Avatar
Simon Mourier [MS]
J'en profite pour faire une remarque. Si l'objet Sites est toujours (ou
souvent) classé par nom, il vaut mieux le faire dériver de IComparable,
comme ça c'est lié directement à la classe (ce qui n'empêche pas de créer
des comparers spécifiques pour des besoins spécifiques)

public int CompareTo(object obj)
{
Sites sites = obj as Sites;
if (sites == null)
throw new ArgumentException();
return this.SiteName.CompareTo(sites.SiteName);
}

Simon.

"Denis" a écrit dans le message de news:

Merci à vous deux, ca fonctionne mieux ainsi !
L'erreur était tellement grosse, shame on me !!

Par contre, puisque je forcais le retour à 0 (donc objets identiques)
pourquoi ne restaient-ils pas classé dans le même ordre ? mystère.


Aloha, 2nis

"Faust" wrote:

voire directement

return sX.SiteName.CompareTo(sY.SiteName);

/_Zim_ a prétendu/ :
> Et si au lieu du return 0, vous mettiez return retour ?
>
> Cordialement,
> Zim.
>
> Denis a écrit :
>> Bonjour à tous, voici ma question du jour.
>>
>> J'ai une collection d'objet, chaque objet représentant un site.
>> Un site, c'est :
>> un ID, le Nom, et 2 champs booleens.
>>
>> Je charge ma collection à partir d'une requete SQL triée sur le nom.
>>
>> Ma collection est liée à un datasource d'un datagrid.
>>
>> Jusque là , tout va bien.
>>
>> Lorsque j'ajoute un site via une interface se saisie, je souhaite
>> retrouver
>> ma collection triée sur le nom du site.
>>
>> J'ai donc fait tout ce qu'il me semble nécessaire de faire dans ma
>> collection pour trier mais objets
>>
>> public class CollectionSites : CollectionBase
>> {
>> public void SortByName()
>> {
>> InnerList.Sort(new NameComparer());
>> }
>>
>> private class NameComparer : IComparer
>> {
>> public int Compare(object x,object y)
>> {
>>
>> Sites sX = x as Sites;
>> Sites sY = y as Sites;
>> int retour >> >> sX.SiteName.CompareTo(sY.SiteName);
>> return 0;
>> }
>> }
>> }
>>
>> mais pas de bol, mais objets se retrouve triés par ordre de bordel
>> presque
>> aléatoire.
>>
>> En mettant un messagebox dans le Compare pour me retourner le nom de
>> chaque
>> site en comparaison, la valeur retournée par CompareTo (-1,0 ou 1)
>> correspond bien à ce qui est attendu.
>>
>> Par exemple, si je saisi ceci :
>> MB15,X,BC,AKZ,N,ZY,XZ
>> j'obtient toujours cela
>> N,BC,XZ,MB15,X,AKZ,ZY
>> au lieu de cela
>> AKZ,BC,MB15,N,X,XZ,ZY
>>
>> C'est quoi ce tri ?
>>
>> Aloha, 2nis

--
*/Teträm/*
http://www.tetram.info

"Avale tout sans réfléchir, ce qui n'est pas commestible resortira
toujours" - Proverbe Troll