2008-10-20 5 views
3

У меня есть пользовательский класс, который реализует этот IComparable. Этот класс хранится в общем списке. Теперь мне нужно сравнить с списками, какие объекты находятся в списке A, но не в списке B.Как получить элементы сравнения в общем списке

Я думал, что самый простой способ сделать это - перебрать список B и выполнить A.contains().

Я не знаю, как заставить его использовать CompareTo() (или другой метод, который я могу переопределить, чтобы я мог сказать, содержит ли он определенный объект или нет). Я мог ошибаться, но, насколько я понимаю, он содержит проверки, если объекты на самом деле одинаковы (т. Е. Указывает на то же место в памяти).

Может ли кто-нибудь мне помочь?

ответ

5

Почему бы вам не переопределить метод Equals вашего класса, чтобы он был по смыслу с CompareTo(other) == 0? Это самый простой способ, а также самый идиоматический, поскольку, как вы заметили, Contains сравнивает равенство, а не использует CompareTo. Однако эта проверка выполняется через Equals. Он не проверить, указывают ли объекты на одно и то же место в памяти.

/EDIT: Кроме того, если вы используете .NET 3.5, вы можете использовать перегрузку Contains, которая принимает аргумент IEqualityComparer. Вы можете использовать это, чтобы предоставить класс, который реализует собственное отношение равенства для вашего типа класса. Однако, я думаю, что первый метод более уместен в вашем случае.

0

Спасибо, Конрад за такой быстрый и полезный ответ. Работал! Первоначально я использовал IComparable, потому что мне нужно было сортировать их по определенным критериям, но переопределяющие равны отлично работали для .contains.

:)

0

его содержит проверки, если объекты на самом деле то же самое (то есть указывает на то же место в памяти)

Обратите внимание, что объект может быть равно, даже если они этого не делают указывают на то же место в памяти. Это зависит от того, как реализован метод EqualsTo.

Я согласен с Рудольфом в том, что вы сначала попытаетесь перегрузить EqualsTo().

1

Кроме того, если вы используете рамки 3.5 вы можете сделать запрос вроде:

список notInB = Из пункта в lišta где (listB.find (функция (х) = x.property item.property) = ничего) select item

Это вернет все элементы списка A, которых нет в спискеB.

Функция поиска функции linq возвращает элемент, соответствующий условию, которое вы пишете в лямбда-функции. Там вы можете добавить дополнительные условия и (& &) или или (||)

Если вы используете это, нет необходимости в реализации IComparable.

+0

Мы используем только 2,0 при работе, но LINQ был бы очень классным способом выполнения всего этого приложения tbh. благодаря – Jon 2008-10-20 13:38:42

0

Существует также IEquatable, и если ваш объект реализует этот интерфейс, он автоматически используется всеми коллекциями обобщений, если он реализован. Хотя я никогда не понимал, почему он существует в первую очередь, поскольку документы говорят, что если вы реализуете IEquatable, тогда вы также должны переопределить Equals для соответствия.Также помните, если вы собираетесь переопределить Equals, вам также необходимо переопределить GetHashCode.

Смежные вопросы