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;
}
}
}