кажется, что оба интерфейса сравнивают объекты на предмет равенства, так в чем же между ними основные различия?
кажется, что оба интерфейса сравнивают объекты на предмет равенства, так в чем же между ними основные различия?
Ответы:
IEquatable<T>
за равенство.
IComparable<T>
для заказа.
В дополнение к ответу Грега Д.
Вы можете реализовать IComparable
без реализации IEquatable
для класса, где частичное упорядочение имеет смысл и где вы определенно хотите, чтобы потребитель сделал вывод, что только потому, что CompareTo()
возвращает ноль, это не означает, что объекты равны (для чего-либо, кроме целей сортировки).
IComparable
оно совершенно неуместно. У вас есть особый порядок, применимый только в одной особой ситуации. Для таких ситуаций IComparable
неправильно использовать генерал . Вот для чего они IComparer
нужны. Например, нельзя упорядочивать людей осмысленно. Но их можно заказать в зависимости от их зарплаты, размера обуви, количества веснушек или веса. Следовательно, мы будем реализовывать разные IComparer
s для всех этих случаев.
Как указано на странице 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
.