2010-03-09 6 views

ответ

160

IEquatable проверяет, равны ли два объекта.

IComparable налагает общий порядок на сравниваемые объекты.

Например, IEquatable бы вам сказать, что 5 не равно 7. IComparable бы вам сказать, что 5 приходит раньше, чем 7.

7

Как указана на MSDN Page for IEquatable:

IComparable интерфейс определяет метод CompareTo, который определяет порядок сортировки экземпляров типа . Интерфейс IEquatable определяет метод Equals, , который определяет равенство экземпляров типа реализации.

Equals против CompareTo

10

В дополнение к Greg двойки ответ:

Вы могли бы реализовать IComparable без реализации IEquatable для класса, в котором частичное упорядочение имеет смысл, и где очень определенно вы хотите потребителя сделать вывод, что только потому, что CompareTo() возвращает ноль, это не подразумевает, что объекты равны (для чего угодно, кроме сортировки).

+9

Это звучит намного больше, чем сравнение с обычным случаем, чем как объект, реализующий «IComparable» правильно. Можете ли вы придумать осмысленный пример, где 'CompareTo (...) == 0' делает ** не ** подразумевает равенство? Я, конечно, не могу. Фактически, контракт интерфейса (согласно MSDN) ** требует **, что 'CompareTo (...) == 0' подразумевает равенство. Скажем прямо, в таком случае, как ваш, используйте специальный объект 'Comparator', do * not * реализуйте' IComparable'. –

+2

@ Konrad - я указал несколько предостережений - что тип не реализует IEquatable (очевидно, что исходник не хочет включать тест равенства), и что результаты CompareTo используются для сортировки, * not * для оценки равенства , Вы также получаете вопросы о том, какое равенство имеет значение (ссылка, значение, игнорирование «произвольных» атрибутов - синяя книга длиной 500 страниц может быть «равной» красной книге длиной 500 страниц для целей IComparable) –

+3

Ваше последнее предложение неверно, и это особая ошибка, которую я хотел бы указать: «IComparable» здесь совершенно неуместен. У вас есть очень * особый * заказ, который применяется только в особой ситуации. Для таких ситуаций реализация общего «IComparable» неверна. Это то, на что «Икомарер». Например, люди не могут быть заказаны осмысленно. Но они * могут быть заказаны в зависимости от их зарплаты, размера обуви, количества их веснушек или их веса. Следовательно, для всех этих случаев мы будем применять разные «IComparer's». –

13

IEquatable<T> для обеспечения равенства.

IComparable<T> для заказа.