IComparable vs Equals () путают, какой использовать - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть класс, который реализует T, где T - это интерфейс.

Я понял, что не могу сделать == для объекта, поэтому я использовал метод Equals() в своем коде:

return (Equals(_nodes[node.QueueIndex] , node));

Но после некоторого поиска в Google, я также нахожу IComparable вариант, поэтому я также могу сделать:

return node.CompareTo(_nodes[node.QueueIndex]) >= 0;

Где мой интерфейс наследует IComparable и реализует его:

public int CompareTo(object obj)
{
    return obj == this ? 1 : 0;
}

Я действительно не понимаю, какой здесь правильный подход к проектированию.Они действительно служат различным целям, какой из них является правильным выбором?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Equals (или IEquatable) - для проверки равенство .IComparable предназначен для проверки на больше, меньше или равно .

Существуют случаи, когда имеет смысл проверять на равенство, но нет интуитивно понятного способа их сравнения.Например, класс ChessPiece в игре в шахматы.

Я не думаю, что IComparable будет хорошим выбором, потому что способ реализации CompareTo довольно неудобен:

public int CompareTo(object obj)
{
    return obj == this ? 1 : 0;
}

Вы все еще здесь проверяете равенство, а не сравниваете объекты.Если вы можете написать правильный CompareTo метод, который не нарушает эти правила , то IComparable является допустимым выбором.

Из этих связанных правил ваши CompareTo разрывыэто правило:

Если A.CompareTo(B) возвращает значение, отличное от нуля, то B.CompareTo(A) должно возвращать значение противоположного знака.

Так что Equals будетбыть более подходящим здесь.

0 голосов
/ 11 декабря 2018

Comparable обычно используется для вещей, которые можно заказать.

Равенство используется, когда вы хотите проверить на равенство.

Если вы хотите упорядочить, тогда сравнимый способ - использовать другоеравный интерфейс

Однако, если вы реализуете сопоставимый, убедитесь, что интерфейс равный соответствует ему.

0 голосов
/ 11 декабря 2018

Интерфейс IComparable

Определяет обобщенный метод сравнения для конкретного типа, который тип значения или класс реализует для порядка или сортировки своих экземпляров .

IEquatable Interface

Определяет обобщенный метод, который тип значения или класс реализует для создания специфичного для типа метода для определения равенства экземпляров .

https://docs.microsoft.com/en-us/dotnet/api/system.icomparable?view=netframework-4.7.2 https://docs.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=netframework-4.7.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...