Compartir vía


IEquatable<T> Interfaz

Definición

Define un método generalizado que implementa un tipo de valor o clase para crear un método específico del tipo para determinar la igualdad de instancias.

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)

Parámetros de tipo

T

Tipo de objetos que se van a comparar.

Derivado

Ejemplos

En el ejemplo siguiente se muestra la implementación parcial de una Person clase que implementa IEquatable<T> y tiene dos propiedades, LastName y NationalId. NationalId se considera un identificador único, por lo que el Equals método devuelve True si la NationalId propiedad de dos Person objetos es idéntica; de lo contrario, devuelve False. (Tenga en cuenta que el ejemplo de F# no controla null los valores de Person las instancias).

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

Comentarios

Esta interfaz se implementa mediante tipos cuyos valores se pueden comparar (por ejemplo, las clases numéricas y de cadena). Un tipo de valor o clase implementa el Equals método para crear un método específico del tipo adecuado para determinar la igualdad de instancias.

Nota

La IComparable<T> interfaz define el CompareTo método , que determina el criterio de ordenación de las instancias del tipo de implementación. La IEquatable<T> interfaz define el Equals método , que determina la igualdad de instancias del tipo de implementación.

La IEquatable<T> interfaz se usa en objetos de colección genéricos como Dictionary<TKey,TValue>, List<T>y LinkedList<T> al probar la igualdad en métodos como Contains, IndexOf, LastIndexOfy Remove. Debe implementarse para cualquier objeto que se pueda almacenar en una colección genérica.

Para obtener más información sobre la implementación de la IEquatable<T> interfaz, vea los comentarios sobre el IEquatable<T>.Equals método .

Notas a los implementadores

Reemplace el parámetro type de la IEquatable<T> interfaz por el tipo que implementa esta interfaz.

Si implementa IEquatable<T>, también debe invalidar las implementaciones de clase base de Equals(Object) y GetHashCode() para que su comportamiento sea coherente con el Equals(T) del método . Si reemplaza Equals(Object), también se llama a la implementación invalidada en llamadas al método estático Equals(System.Object, System.Object) de la clase . Además, debe sobrecargar los op_Equality operadores y op_Inequality . Esto garantiza que todas las pruebas de igualdad devuelvan resultados coherentes.

Para obtener información sobre cómo invalidar Equals(Object), vea Equals(Object).

Para un tipo de valor, siempre debe implementar IEquatable<T> e invalidar Equals(Object) para mejorar el rendimiento. Equals(Object) boxes tipos de valor y se basa en la reflexión para comparar dos valores para la igualdad. Tanto la implementación de como la invalidación de Equals(T)Equals(Object) deben devolver resultados coherentes.

Si implementa , también debe implementar IEquatable<T>IComparable<T> si las instancias del tipo se pueden ordenar o ordenar. Si el tipo implementa IComparable<T>, casi siempre también implementará IEquatable<T>.

Tenga en cuenta que hay algunos diseños en los que un tipo admite una relación de pedido, pero la igualdad puede ser distinta de una relación de ordenación. Considere una Person clase en la que se ordena alfabéticamente. Dos personas con el mismo nombre ordenan lo mismo, pero no son la misma persona.

Métodos

Nombre Description
Equals(T)

Indica si el objeto actual es igual a otro objeto del mismo tipo.

Se aplica a

Consulte también