les deux interfaces semblent comparer les objets pour l'égalité, alors quelles sont les principales différences entre eux?
IEquatable
teste si deux objets sont égaux.
IComparable
impose un ordre total aux objets à comparer.
Par exemple, IEquatable
vous dirait que 5 n'est pas égal à 7. IComparable
vous dirait que 5 précède 7.
IEquatable<T>
pour l'égalité.
IComparable<T>
pour commander.
En plus de la réponse de Greg D:
Vous pouvez implémenter IComparable
sans implémenter IEquatable
pour une classe où un ordre partiel est logique, et où vous voulez très certainement que le consommateur infère cela simplement parce que CompareTo()
renvoie zéro, cela ne signifie pas implique que les objets sont égaux (pour autre chose que le tri).
Comme indiqué sur la Page MSDN pour IEquatable :
L'interface IComparable définit la méthode
CompareTo
, qui détermine l'ordre de tri des instances du type d'implémentation. L'interface IEquatable définit la méthodeEquals
, qui détermine l'égalité des instances du type d'implémentation.
Equals
contre CompareTo
IComparable <T>
Définit une méthode de comparaison spécifique au type qui peut être utilisée pour classer ou trier des objets.
IEquatable <T>
Définit une méthode généralisée qui peut être utilisée pour implémenter la détermination de l'égalité.
Disons que vous avez une classe 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();
.Mais cela va jeter une exception.
Framework ne sait pas comment trier ces objets. Vous devez indiquer comment trier l'implémentation de l'interface 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);
}
}
}
Cela triera le tableau correctement avec la méthode Sort()
.
Equals()
.var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
Cela renverra false
car la méthode Equals
ne sait pas comparer deux objets. Par conséquent, vous devez implémenter l'interface IEquatable
et indiquer au framework comment effectuer la comparaison. En prolongeant l'exemple précédent, cela ressemblera à ceci.
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;
}
}
}