В чем разница между интерфейсами IComparable и IEquatable? - PullRequest
88 голосов
/ 09 марта 2010

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

Ответы [ 5 ]

178 голосов
/ 09 марта 2010

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

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

Например, IEquatable скажет вам, что 5 не равно 7. IComparable скажет, что 5 предшествует 7.

15 голосов
/ 09 марта 2010

IEquatable<T> за равенство.

IComparable<T> за заказ.

10 голосов
/ 09 марта 2010

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

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

7 голосов
/ 09 марта 2010

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

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

Equals против CompareTo

0 голосов
/ 28 апреля 2019

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;
        }
    }
}
...