Поделиться через


IEquatable<T> Интерфейс

Определение

Определяет обобщенный метод, реализующий тип значения или класс для создания метода для определения равенства экземпляров.

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)

Параметры типа

T

Тип объектов для сравнения.

Производный

Примеры

В следующем примере показана частичная реализация Person класса, реализующего IEquatable<T> и имеющего два свойства, LastName и NationalId. NationalId считается уникальным идентификатором, поэтому Equals метод возвращает True , если NationalId свойство двух Person объектов идентично; в противном случае возвращается False. (Обратите внимание, что пример F# не обрабатывает null значения для Person экземпляров.)

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

Комментарии

Этот интерфейс реализуется типами, значения которых можно приравнять (например, числовые и строковые классы). Тип значения или класс реализует Equals метод для создания метода, подходящего для определения равенства экземпляров.

Заметка

Интерфейс IComparable<T> определяет метод, который определяет CompareTo порядок сортировки экземпляров реализующего типа. Интерфейс IEquatable<T> определяет Equals метод, который определяет равенство экземпляров реализующего типа.

Интерфейс IEquatable<T> используется объектами универсальной коллекции, такими как Dictionary<TKey,TValue>, List<T>и LinkedList<T> при тестировании на равенство в таких методах, как Contains, IndexOfи LastIndexOfRemove. Он должен быть реализован для любого объекта, который может храниться в универсальной коллекции.

Дополнительные сведения о реализации интерфейса см. в примечаниях IEquatable<T> к методу IEquatable<T>.Equals .

Примечания для тех, кто реализует этот метод

Замените параметр IEquatable<T> типа интерфейса типом, реализующим этот интерфейс.

При реализации IEquatable<T>следует также переопределить реализации Equals(Object) базового класса и GetHashCode() обеспечить соответствие их поведения методу Equals(T) . При переопределении Equals(Object)реализация переопределения также вызывается в вызовах статического Equals(System.Object, System.Object) метода класса. Кроме того, следует перегрузить op_Equality операторы и op_Inequality операторы. Это гарантирует, что все тесты на равенство возвращают согласованные результаты.

Дополнительные сведения о переопределении Equals(Object)см. в статье Equals(Object).

Для типа значения всегда следует реализовать и переопределить IEquatable<T>Equals(Object) для повышения производительности. Equals(Object) поля типы значений и используют отражение для сравнения двух значений для равенства. Реализация и переопределение Equals(T)Equals(Object) должны возвращать согласованные результаты.

При реализации IEquatable<T>также следует реализовать IComparable<T> , если экземпляры типа можно упорядочить или отсортировать. Если тип реализуется IComparable<T>, вы почти всегда реализуете IEquatable<T>.

Обратите внимание, что существуют некоторые конструкции, в которых тип поддерживает отношение порядка, но равенство может отличаться от отношения упорядочения. Рассмотрим класс, Person в котором выполняется сортировка по алфавиту. Два человека с одинаковым именем сортируют то же самое, но не один и тот же человек.

Методы

Имя Описание
Equals(T)

Указывает, равен ли текущий объект другому объекту того же типа.

Применяется к

См. также раздел