2009-07-02 14 views
8

Mam List<MyObj> z class MyObj : IComparable. Napisałem metodę CompareTo w klasie MyObj na interfejsie IComparable, ale kiedy używam List<MyObj>.Contains(myObjInstance), zwraca ona false, gdy powinna być true.Modyfikuj listę. Zachowuje zachowanie

Nie jestem pewien, czy rozumiem, w jaki sposób należy wykonać, aby upewnić się, że List używa mojej niestandardowej metody porównywania podczas wywoływania funkcji Contains.

Oto moja realizacja compareTo:

#region IComparable Members 

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

    #endregion 

Uwaga własnością Symbol jest ciągiem.

Aby wyjaśnić, umieściłem punkt zatrzymania w tej metodzie compareTo i nawet tam nie wchodzi.

Ktoś kiedykolwiek próbował tego?

Dzięki.

+0

Czy możesz pokazać nam swój kod? –

+0

Wykonanie tej konkretnie implementacji CompareTo –

Odpowiedz

22

Najłatwiejszym sposobem sprawdzenia, czy wywoływana jest metoda CompareTo, jest ustawienie punktu przerwania i naciśnięcie klawisza F5 w celu uruchomienia programu. Ale uważam, że List<T>.Contains szuka interfejsu IEquatable<T> do dokonywania porównania.

+0

. To się nie kończy. :( – Lancelot

+0

@ Lancelot: Przeczytaj także drugie zdanie; o) –

+0

Przepraszam, że czytałem trochę szybko. Wypróbuję to i dam ci znać. Dzięki. :) – Lancelot

2

Czy próbowałeś przesłonić metodę Equals?

List<T>, zgodnie z odbłyśnikiem, wykorzystuje EqualityComparer<T> sprawdzić zapobiegające rozprzestrzenianiu się skażenia i wdrożenie domyślne (ObjectEqualityComparer) wykorzystuje Równa dla większości normalnych obiektów.

5

Według documentation dla List<T>.Contains, wykorzystuje zarówno swoją realizację IEquatable interfejsu lub object.Equals, który można zastąpić, jak również.