Какая разница между интерфейсами IComparable и IEquatable?

оба интерфейса, похоже, сравнивают объекты для равенства, и каковы основные различия между ними?

Ответ 1

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

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

Например, IEquatable сообщит вам, что 5 не равно 7. IComparable сообщит вам, что 5 до 7.

Ответ 2

IEquatable<T> для равенства.

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

Ответ 3

В дополнение к ответу Грега D:

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

Ответ 4

Как указано на странице MSDN для IEquatable:

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

Equals против CompareTo

Ответ 5

IComparable <T> определяет специфический для типа метод сравнения, который можно использовать для упорядочения или сортировки объектов.

IEquatable <T> определяет обобщенный метод, который можно использовать для определения равенства.


Допустим, у вас есть класс Person

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };

List<Person> people = new List<Person> { p1, p2, p3, p4 };

Для сортировки этих объектов вы можете использовать people.Sort(); ,

Но это будет исключение.

enter image description here

Framework не знает, как сортировать эти объекты. Вы должны рассказать, как сортировать реализацию интерфейса IComparable.

public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(object obj)
    {
        Person otherPerson = obj as Person;
        if (otherPerson == null)
        {
            throw new ArgumentNullException();
        }
        else
        {
            return Age.CompareTo(otherPerson.Age);
        }
    }
}

Это позволит правильно отсортировать массив с помощью метода Sort().


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

var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);

Это вернет false потому что метод Equals не знает, как сравнивать два объекта. Следовательно, вам нужно реализовать интерфейс IEquatable и указать платформе, как проводить сравнение. Продолжая предыдущий пример, это будет выглядеть так.

public class Person : IComparable, IEquatable<Person>
{
    //Some code hidden

    public bool Equals(Person other)
    {
        if (Age == other.Age && Name == other.Name)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}