Изменить поведение List.Contains

У меня есть 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, и он даже не идет туда.

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

Спасибо.


person Lancelot    schedule 02.07.2009    source источник
comment
В частности, реализация CompareTo   -  person Austin Salonen    schedule 02.07.2009


Ответы (3)


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

person Fredrik Mörk    schedule 02.07.2009
comment
@Lancelot: Прочтите и второе предложение ;о) - person Fredrik Mörk; 02.07.2009
comment
Извините, я немного быстро прочитал. Я попробую это и дам вам знать. Спасибо. :) - person Lancelot; 03.07.2009
comment
Вот оно. Секрет заключался в интерфейсе IEquatable. :) Спасибо. - person Lancelot; 03.07.2009

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

person svick    schedule 02.07.2009

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

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

person Senthil Kumar    schedule 02.07.2009