IComparable <T>
définit une méthode de comparaison spécifique à un type qui peut être utilisée pour ordonner ou trier des objets.
IEquatable <T>
définit une méthode généralisée qui peut être utilisée pour mettre en œuvre la détermination de l'égalité.
Disons que vous avez la classe Personne
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 };
Pour trier ces objets, vous pouvez utiliser people.Sort();
.
Mais cela déclenchera une exception.
Le cadre ne sait pas comment trier ces objets. Vous devez lui dire comment trier en implémentant IComparable
interface.
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 permettra de trier le tableau correctement avec Sort()
méthode.
Ensuite, pour comparer deux objets, vous pouvez utiliser Equals()
méthode.
var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
Cela donnera false
parce que Equals
ne sait pas comment comparer deux objets. Vous devez donc implémenter IEquatable
et indiquer au framework comment effectuer la comparaison. Dans le prolongement de 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;
}
}
}