Ответ 1
IEquatable
проверяет, равны ли два объекта.
IComparable
накладывает общий порядок на сравниваемые объекты.
Например, IEquatable
сообщит вам, что 5 не равно 7. IComparable
сообщит вам, что 5 до 7.
оба интерфейса, похоже, сравнивают объекты для равенства, и каковы основные различия между ними?
IEquatable
проверяет, равны ли два объекта.
IComparable
накладывает общий порядок на сравниваемые объекты.
Например, IEquatable
сообщит вам, что 5 не равно 7. IComparable
сообщит вам, что 5 до 7.
IEquatable<T>
для равенства.
IComparable<T>
для заказа.
В дополнение к ответу Грега D:
Вы можете реализовать IComparable без реализации IEquatable для класса, где имеет смысл частичный порядок заказа, и где вы определенно хотите, чтобы потребитель сделал вывод, что только потому, что CompareTo() возвращает ноль, это не означает, что объекты равны (для чего угодно, кроме сортировки).
Как указано на странице MSDN для IEquatable:
Интерфейс IComparable определяет метод
CompareTo
, который определяет порядок сортировки экземпляров реализующий тип. IEquatable интерфейс определяет методEquals
которая определяет равенство экземпляры типа реализации.
Equals
против CompareTo
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;
}
}
}