2009-07-02 5 views
8

У меня есть List<MyObj> с class MyObj : IComparable. Я написал метод CompareTo в классе MyObj на интерфейс IComparable, но когда я использую List<MyObj>.Contains(myObjInstance), он возвращает false, когда он должен быть true.Изменение списка. Поведение поведения

Я не уверен, что понимаю, как мне нужно, чтобы убедиться, что List использует мой пользовательский метод сравнения при вызове функции Contains.

Вот моя реализация CompareTo:

#region IComparable Members 

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

    #endregion 

Примечание свойство Symbol является строкой.

Чтобы уточнить, я поставил точку остановки в методе compareTo, и он даже не входит туда.

Кто-нибудь когда-либо пробовал это?

Спасибо.

+0

Можете ли вы показать нам свой код? –

+0

В частности, реализация CompareTo –

ответ

22

Абсолютно простой способ узнать, вызывается ли ваш метод CompareTo, - установить в нем точку останова и нажать F5 для запуска вашей программы. Но я считаю, что List<T>.Contains ищет интерфейс IEquatable<T> для сравнения.

+0

сделано это. Это не останавливается. :( – Lancelot

+0

@ Lancelot: Прочтите второе предложение, а) –

+0

Извините, я прочитал немного быстро. Я попробую это и дам вам знать. Благодарю. :) – Lancelot

2

Вы пытались переопределить метод Equals?

List<T>, в соответствии с рефлектором, использует EqualityComparer<T> для проверки на локализацию, а реализация по умолчанию (ObjectEqualityComparer) использует Equals для большинства обычных объектов.

5

Согласно documentation для List<T>.Contains она использует либо вашу реализацию IEquatable интерфейса или object.Equals, что вы можете изменить, а также.