У меня есть собственный класс, который реализует IComparable. Этот класс хранится в универсальном списке. Теперь мне нужно сравнить со списками, чтобы увидеть, какие объекты находятся в списке A, но не в списке B.
Я думал, что самый простой способ сделать это - перебрать список B и выполнить A.contains ().
Я не знаю, как заставить его использовать мой CompareTo () (или другой метод, который я могу переопределить, чтобы я мог сказать, содержит ли он определенный объект или нет). Я мог ошибаться, но, насколько я понимаю, contains проверяет, действительно ли объекты одинаковы (т.е. указывают на одно и то же место в памяти).
Может ли кто-нибудь мне помочь?





Почему бы вам просто не переопределить метод Equals вашего класса, чтобы он соответствовал значению CompareTo(other) == 0? Это самый простой и наиболее идиоматичный способ, поскольку, как вы заметили, Contains сравнивает равенство, а не использует CompareTo. Однако эта проверка выполняется через Equals. нет проверяет, указывают ли объекты на одну и ту же ячейку памяти.
/ EDIT: Кроме того, если вы используете .NET 3.5, вы можете использовать перегрузку Contains, которая принимает аргумент IEqualityComparer. Вы можете использовать это, чтобы предоставить класс, который реализует настраиваемое отношение равенства для вашего типа класса. Однако я думаю, что в вашем случае больше подходит первый способ.
Спасибо, Конрад, за такой быстрый и полезный ответ. Получилось угощение! Изначально я использовал IComparable, потому что мне нужно было отсортировать их по определенным критериям, но переопределение равенства отлично работало для .contains.
:)
it the contains checks if the objects are actually the same (i.e. points to the same place in memory)
Обратите внимание, что объекты могут быть одинаковыми, даже если они не указывают на одно и то же место в памяти. Это зависит от того, как реализован метод EqualsTo.
Я согласен с Рудольфом в том, что вы сначала пытаетесь перегрузить EqualsTo ().
Также, если вы используете framework 3.5, вы можете сделать такой запрос:
list notInB = Из элемента в listA, где (listB.find (function (x) x.property = item.property) = ничего) выберите элемент
Это вернет все элементы спискаA, которых нет в спискеB.
Функция linq find возвращает элемент, который соответствует условию, указанному в лямбда-функции. Там вы можете добавить дополнительные условия, используя и (&&) или или (||)
Если вы используете это, нет необходимости реализовывать IComparable.
Существует также IEquatable, и если ваш объект реализует этот интерфейс, он автоматически используется всеми универсальными коллекциями, если он реализован. Хотя я так и не понял, почему он вообще существует, поскольку в документации говорится, что если вы реализуете IEquatable, вы также должны переопределить Equals для соответствия. Также помните, что если вы собираетесь переопределить Equals, вам также необходимо переопределить GetHashCode.
мы используем только 2.0 на работе, но LINQ был бы очень крутым способом сделать все это приложение tbh. Спасибо