Изменить список. Содержит поведение
-
21-08-2019 - |
Вопрос
у меня есть 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 для большинства обычных объектов.