web-dev-qa-db-fra.com

Quelle est la différence entre les interfaces IComparable et IEquatable?

les deux interfaces semblent comparer les objets pour l'égalité, alors quelles sont les principales différences entre eux?

91
SoftwareGeek

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.

182
Greg D

IEquatable<T> pour l'égalité.

IComparable<T> pour commander.

15
Islam Yahiatene

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).

10

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éthode Equals, qui détermine l'égalité des instances du type d'implémentation.

Equals contre CompareTo

6
Will Eddins

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

Pour trier ces objets, vous pouvez utiliser people.Sort();.

Mais cela va jeter une exception.

enter image description here

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().


Ensuite, pour comparer deux objets, vous pouvez utiliser la méthode 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;
        }
    }
}
3
Nipuna