кажется, что оба интерфейса сравнивают объекты на предмет равенства, так в чем же между ними основные различия?
c#
interface
icomparable
iequatable
Программное обеспечениеGeek
источник
источник
IComparable
правильную реализацию объекта . Можете ли вы привести содержательный пример,CompareTo(…) == 0
который не подразумевает равенства? Я точно не могу. На самом деле, контракт интерфейс (как в MSDN) требует , чтоCompareTo(…) == 0
подразумевает равенство. Грубо говоря, в таком случае, как ваш, используйте специальныйComparator
предмет, а не реализуйтеIComparable
.IComparable
оно совершенно неуместно. У вас есть особый порядок, применимый только в одной особой ситуации. Для таких ситуацийIComparable
неправильно использовать генерал . Вот для чего ониIComparer
нужны. Например, нельзя упорядочивать людей осмысленно. Но их можно заказать в зависимости от их зарплаты, размера обуви, количества веснушек или веса. Следовательно, мы будем реализовывать разныеIComparer
s для всех этих случаев.Как указано на странице MSDN для IEquatable :
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
нет?