2009-07-02 35 views
8

J'ai un List<MyObj> avec le class MyObj : IComparable. J'ai écrit la méthode CompareTo dans la classe MyObj par l'interface IComparable, mais quand j'utilise le List<MyObj>.Contains(myObjInstance) il renvoie false alors qu'il devrait être true.Modifier la liste.Contient le comportement

Je ne suis pas sûr de comprendre comment je dois procéder pour s'assurer que le List utilise ma méthode de comparaison personnalisée lors de l'appel, puis Contains fonction.

Voici mon implémentation de compareTo:

#region IComparable Members 

    public int CompareTo(object obj) 
    { 
     MyObj myObj = (MyObj)obj; 
     return String.Compare(this.Symbol, myObj.Symbol, true); 
    } 

    #endregion 

Remarque la propriété Symbol est une chaîne.

Pour clarifier j'ai mis un point d'arrêt dans cette méthode compareTo et il ne va même pas là-bas.

Quelqu'un a déjà essayé cela?

Merci.

+0

Pouvez-vous nous indiquer votre code? –

+0

Plus précisément, la mise en œuvre de CompareTo –

Répondre

22

La manière la plus simple de savoir si votre méthode CompareTo est appelée est de définir un point d'arrêt et d'appuyer sur F5 pour exécuter votre programme. Mais je crois que List<T>.Contains cherche l'interface IEquatable<T> pour faire la comparaison.

+0

fait cela. Cela ne s'arrête pas là. :( – Lancelot

+0

@Lancelot: Lire aussi la deuxième phrase; o) –

+0

Désolé je lis un peu vite. Je vais essayer cela et vous le faire savoir. Merci. :) – Lancelot

2

Avez-vous essayé de remplacer la méthode Equals?

List<T>, selon réflecteur, utilise EqualityComparer<T> pour vérifier le confinement, et l'implémentation par défaut (ObjectEqualityComparer) utilise Equals pour la plupart des objets normaux.

5

Selon le documentation pour List<T>.Contains, il utilise soit l'implémentation de l'interface ou IEquatableobject.Equals, que vous pouvez remplacer aussi bien.