оба интерфейса, похоже, сравнивают объекты для равенства, и каковы основные различия между ними?
Какая разница между интерфейсами 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();
,
Но это будет исключение.
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;
}
}
}