Sdílet prostřednictvím


IEquatable<T> Rozhraní

Definice

Definuje generalizovanou metodu, kterou typ hodnoty nebo třída implementuje k vytvoření metody specifické pro typ pro určení rovnosti instancí.

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)

Parametry typu

T

Typ objektů, které chcete porovnat.

Odvozené

Příklady

Následující příklad ukazuje částečnou Person implementaci třídy, která implementuje IEquatable<T> a má dvě vlastnosti, LastName a NationalId. NationalId je považován za jedinečný identifikátor, proto Equals metoda vrátí True , pokud NationalId je vlastnost dvou Person objektů identická; v opačném případě vrátí False. (Všimněte si, že příklad jazyka F# nezpracuje null hodnoty pro Person instance.)

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

Poznámky

Toto rozhraní je implementováno pomocí typů, jejichž hodnoty lze rovníkovat (například číselné a řetězcové třídy). Typ hodnoty nebo třída implementuje metodu Equals pro vytvoření metody specifické pro typ vhodný pro určení rovnosti instancí.

Poznámka

Rozhraní IComparable<T> definuje metodu CompareTo , která určuje pořadí řazení instancí implementového typu. Rozhraní IEquatable<T> definuje metodu Equals , která určuje rovnost instancí implementového typu.

Rozhraní IEquatable<T> se používá obecnými objekty kolekce, jako Dictionary<TKey,TValue>je , List<T>a LinkedList<T> při testování rovnosti v takových metodách jako Contains, IndexOf, LastIndexOfa Remove. Měla by být implementována pro všechny objekty, které by mohly být uloženy v obecné kolekci.

Další informace o implementaci IEquatable<T> rozhraní naleznete v poznámkách k IEquatable<T>.Equals metodě.

Poznámky pro implementátory

Nahraďte parametr IEquatable<T> typu rozhraní typem, který implementuje toto rozhraní.

Pokud implementujete IEquatable<T>, měli byste také přepsat implementace Equals(Object) základní třídy a GetHashCode() tak, aby jejich chování bylo konzistentní s metodou Equals(T) . Pokud přepíšete Equals(Object), přepsaná implementace se také volá ve volání statické Equals(System.Object, System.Object) metody ve vaší třídě. Kromě toho byste měli přetížit operátory op_Equality a op_Inequality operátory. Tím zajistíte, že všechny testy rovnosti vrátí konzistentní výsledky.

Informace o přepsání Equals(Object)naleznete v tématu Equals(Object).

Pro typ hodnoty byste měli vždy implementovat IEquatable<T> a přepsat Equals(Object) pro lepší výkon. Equals(Object) Typy hodnot polí a spoléhá na reflexi při porovnání dvou hodnot rovnosti. Implementace Equals(T) i přepsání Equals(Object) by měly vrátit konzistentní výsledky.

Pokud implementujete IEquatable<T>, měli byste také implementovat IComparable<T> , pokud je možné řadit nebo řadit instance typu. Pokud váš typ implementuje IComparable<T>, téměř vždy také implementujete IEquatable<T>.

Všimněte si, že existuje několik návrhů, ve kterých typ podporuje relaci pořadí, ale rovnost se může lišit od relace řazení. Person Představte si třídu, ve které seřadíte abecedně. Dva lidé se stejným jménem se seřadí stejné, ale nejsou stejní.

Metody

Name Description
Equals(T)

Určuje, zda je aktuální objekt roven jinému objektu stejného typu.

Platí pro

Viz také