Partage via


IEquatable<T> Interface

Définition

Définit une méthode généralisée qu’un type valeur ou une classe implémente pour créer une méthode spécifique au type pour déterminer l’égalité des instances.

generic <typename T>
public interface class IEquatable
public interface IEquatable<T>
public interface IEquatable<T> where T : allows ref struct
type IEquatable<'T> = interface
Public Interface IEquatable(Of T)

Paramètres de type

T

Type d’objets à comparer.

Dérivé

Exemples

L’exemple suivant montre l’implémentation partielle d’une Person classe qui implémente IEquatable<T> et a deux propriétés, LastName et NationalId. NationalIdest considéré comme un identificateur unique, par conséquent, la méthode retourne True si la NationalId propriété de deux Person objets est identique ; sinon, elle retourne False.Equals (Notez que l’exemple F# ne gère pas les null valeurs des Person instances.)

public class Person : IEquatable<Person>
{
    public Person(string lastName, string ssn)
    {
        LastName = lastName;
        NationalId = ssn;
    }

    public string LastName { get; }

    public string NationalId { get; }

    public bool Equals(Person? other) => other is not null && other.NationalId == NationalId;

    public override bool Equals(object? obj) => Equals(obj as Person);

    public override int GetHashCode() => NationalId.GetHashCode();

    public static bool operator ==(Person person1, Person person2)
    {
        if (person1 is null)
        {
            return person2 is null;
        }

        return person1.Equals(person2);
    }

    public static bool operator !=(Person person1, Person person2)
    {
        if (person1 is null)
        {
            return person2 is not null;
        }

        return !person1.Equals(person2);
    }
}
open System

type Person(lastName: string, nationalId: string) =
    member this.LastName = lastName
    member this.NationalId = nationalId

    interface IEquatable<Person> with
        member this.Equals(other: Person) =
            other.NationalId = this.NationalId

    override this.Equals(obj: obj) =
        match obj with
        | :? Person as person -> (this :> IEquatable<Person>).Equals(person)
        | _ -> false

    override this.GetHashCode() =
        this.NationalId.GetHashCode()

    static member (==) (person1: Person, person2: Person) =
        person1.Equals(person2)

    static member (!=) (person1: Person, person2: Person) =
        not (person1.Equals(person2))
Public Class Person
    Implements IEquatable(Of Person)

    Public Sub New(lastName As String, nationalId As String)
        Me.LastName = lastName
        Me.NationalId = nationalId
    End Sub

    Public ReadOnly Property LastName As String
    Public ReadOnly Property NationalId As String

    Public Overloads Function Equals(other As Person) As Boolean Implements IEquatable(Of Person).Equals
        Return other IsNot Nothing AndAlso other.NationalId = Me.NationalId
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean
        Return Equals(TryCast(obj, Person))
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return NationalId.GetHashCode()
    End Function

    Public Shared Operator =(person1 As Person, person2 As Person) As Boolean
        If person1 Is Nothing Then
            Return person2 Is Nothing
        End If
        Return person1.Equals(person2)
    End Operator

    Public Shared Operator <>(person1 As Person, person2 As Person) As Boolean
        If person1 Is Nothing Then
            Return person2 IsNot Nothing
        End If
        Return Not person1.Equals(person2)
    End Operator
End Class

Remarques

Cette interface est implémentée par des types dont les valeurs peuvent être équivalentes (par exemple, les classes numériques et de chaînes). Un type de valeur ou une classe implémente la Equals méthode pour créer une méthode spécifique au type adaptée à la détermination de l’égalité des instances.

Note

L’interface IComparable<T> définit la CompareTo méthode, qui détermine l’ordre de tri des instances du type d’implémentation. L’interface IEquatable<T> définit la Equals méthode, qui détermine l’égalité des instances du type d’implémentation.

L’interface IEquatable<T> est utilisée par des objets de collection génériques tels que Dictionary<TKey,TValue>, List<T>et LinkedList<T> lors du test de l’égalité dans des méthodes telles que Contains, IndexOf, LastIndexOfet Remove. Elle doit être implémentée pour tout objet susceptible d’être stocké dans une collection générique.

Pour plus d’informations sur l’implémentation de l’interface IEquatable<T> , consultez les remarques sur la IEquatable<T>.Equals méthode.

Notes pour les responsables de l’implémentation

Remplacez le paramètre de type de l’interface IEquatable<T> par le type qui implémente cette interface.

Si vous implémentez IEquatable<T>, vous devez également remplacer les implémentations de classe de base et Equals(Object)GetHashCode() pour que leur comportement soit cohérent avec celui de la Equals(T) méthode. Si vous remplacez Equals(Object), votre implémentation substituée est également appelée dans les appels à la méthode statique Equals(System.Object, System.Object) sur votre classe. En outre, vous devez surcharger les opérateurs et op_Inequality les op_Equality opérateurs. Cela garantit que tous les tests d’égalité retournent des résultats cohérents.

Pour plus d’informations sur la Equals(Object)substitution, consultez Equals(Object).

Pour un type valeur, vous devez toujours implémenter IEquatable<T> et remplacer Equals(Object) pour de meilleures performances. Equals(Object) types de valeurs de zones et s’appuie sur la réflexion pour comparer deux valeurs pour l’égalité. Votre implémentation Equals(T) et votre remplacement Equals(Object) doivent retourner des résultats cohérents.

Si vous implémentez IEquatable<T>, vous devez également implémenter IComparable<T> si des instances de votre type peuvent être triées ou triées. Si votre type implémente, vous implémentez IComparable<T>IEquatable<T>presque toujours également .

Notez qu’il existe certaines conceptions où un type prend en charge une relation d’ordre, mais l’égalité peut être distincte d’une relation de classement. Considérez une Person classe dans laquelle vous triez par ordre alphabétique. Deux personnes portant le même nom trient la même chose, mais ne sont pas la même personne.

Méthodes

Nom Description
Equals(T)

Indique si l’objet actuel est égal à un autre objet du même type.

S’applique à

Voir aussi