Вопрос

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

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

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

    #region IComparable Members

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

    #endregion

Обратите внимание, что свойство Символ представляет собой строку.

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

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

Спасибо.

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top