кажется, что оба интерфейса сравнивают объекты на предмет равенства, так в чем же между ними основные различия?
кажется, что оба интерфейса сравнивают объекты на предмет равенства, так в чем же между ними основные различия?
Ответы:
IEquatable<T> за равенство.
IComparable<T> для заказа.
В дополнение к ответу Грега Д.
Вы можете реализовать IComparableбез реализации IEquatableдля класса, где частичное упорядочение имеет смысл и где вы определенно хотите, чтобы потребитель сделал вывод, что только потому, что CompareTo()возвращает ноль, это не означает, что объекты равны (для чего-либо, кроме целей сортировки).
IComparableоно совершенно неуместно. У вас есть особый порядок, применимый только в одной особой ситуации. Для таких ситуаций IComparableнеправильно использовать генерал . Вот для чего они IComparerнужны. Например, нельзя упорядочивать людей осмысленно. Но их можно заказать в зависимости от их зарплаты, размера обуви, количества веснушек или веса. Следовательно, мы будем реализовывать разные IComparers для всех этих случаев.
Как указано на странице MSDN для IEquatable :
Интерфейс IComparable определяет
CompareToметод, который определяет порядок сортировки экземпляров реализующего типа. Интерфейс IEquatable определяетEqualsметод, который определяет равенство экземпляров реализующего типа.
Equals vs. 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;
}
}
}
IEquatableиспользуется дженерик, <Person>а IComparableнет?
IComparableправильную реализацию объекта . Можете ли вы привести содержательный пример,CompareTo(…) == 0который не подразумевает равенства? Я точно не могу. На самом деле, контракт интерфейс (как в MSDN) требует , чтоCompareTo(…) == 0подразумевает равенство. Грубо говоря, в таком случае, как ваш, используйте специальныйComparatorпредмет, а не реализуйтеIComparable.