оба интерфейса, похоже, сравнивают объекты для равенства, так что в чем главные различия между ними?В чем разница между интерфейсами IComparable и IEquatable?
ответ
IEquatable
проверяет, равны ли два объекта.
IComparable
налагает общий порядок на сравниваемые объекты.
Например, IEquatable
бы вам сказать, что 5 не равно 7. IComparable
бы вам сказать, что 5 приходит раньше, чем 7.
Как указана на MSDN Page for IEquatable:
IComparable интерфейс определяет метод
CompareTo
, который определяет порядок сортировки экземпляров типа . Интерфейс IEquatable определяет методEquals
, , который определяет равенство экземпляров типа реализации.
Equals
против CompareTo
В дополнение к Greg двойки ответ:
Вы могли бы реализовать IComparable без реализации IEquatable для класса, в котором частичное упорядочение имеет смысл, и где очень определенно вы хотите потребителя сделать вывод, что только потому, что CompareTo() возвращает ноль, это не подразумевает, что объекты равны (для чего угодно, кроме сортировки).
IEquatable<T>
для обеспечения равенства.
IComparable<T>
для заказа.
Это звучит намного больше, чем сравнение с обычным случаем, чем как объект, реализующий «IComparable» правильно. Можете ли вы придумать осмысленный пример, где 'CompareTo (...) == 0' делает ** не ** подразумевает равенство? Я, конечно, не могу. Фактически, контракт интерфейса (согласно MSDN) ** требует **, что 'CompareTo (...) == 0' подразумевает равенство. Скажем прямо, в таком случае, как ваш, используйте специальный объект 'Comparator', do * not * реализуйте' IComparable'. –
@ Konrad - я указал несколько предостережений - что тип не реализует IEquatable (очевидно, что исходник не хочет включать тест равенства), и что результаты CompareTo используются для сортировки, * not * для оценки равенства , Вы также получаете вопросы о том, какое равенство имеет значение (ссылка, значение, игнорирование «произвольных» атрибутов - синяя книга длиной 500 страниц может быть «равной» красной книге длиной 500 страниц для целей IComparable) –
Ваше последнее предложение неверно, и это особая ошибка, которую я хотел бы указать: «IComparable» здесь совершенно неуместен. У вас есть очень * особый * заказ, который применяется только в особой ситуации. Для таких ситуаций реализация общего «IComparable» неверна. Это то, на что «Икомарер». Например, люди не могут быть заказаны осмысленно. Но они * могут быть заказаны в зависимости от их зарплаты, размера обуви, количества их веснушек или их веса. Следовательно, для всех этих случаев мы будем применять разные «IComparer's». –