IEquatable<T>.Equals(T) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает, равен ли текущий объект другому объекту того же типа.
public:
bool Equals(T other);
public bool Equals(T other);
public bool Equals(T? other);
abstract member Equals : 'T -> bool
Public Function Equals (other As T) As Boolean
Параметры
- other
- T
Объект для сравнения с этим объектом.
Возвращаемое значение
trueЗначение , otherесли текущий объект равен параметруfalse; в противном случае .
Примеры
В следующем примере показана частичная реализация 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
Person При хранении в объекте List<T>Contains используется его Equals реализация для поиска совпадения.
List<Person> applicants = new List<Person>()
{
new Person("Jones", "099-29-4999"),
new Person("Jones", "199-29-3999"),
new Person("Jones", "299-49-6999")
};
// Create a Person object for the final candidate.
Person candidate = new Person("Jones", "199-29-3999");
bool contains = applicants.Contains(candidate);
Console.WriteLine($"{candidate.LastName} ({candidate.NationalId}) is on record: {contains}");
// The example prints the following output:
// Jones (199-29-3999) is on record: True
let applicants =
[ Person("Jones", "099-29-4999")
Person("Jones", "199-29-3999")
Person("Jones", "299-49-6999") ]
let candidate = Person("Jones", "199-29-3999")
let contains = List.contains candidate applicants
printfn "%s (%s) is on record: %b" candidate.LastName candidate.NationalId contains
// The example prints the following output:
// Jones (199-29-3999) is on record: true
Dim applicants As New List(Of Person)
applicants.Add(New Person("Jones", "099-29-4999"))
applicants.Add(New Person("Jones", "199-29-3999"))
applicants.Add(New Person("Jones", "299-49-6999"))
' Create a Person object for the final candidate.
Dim candidate As New Person("Jones", "199-29-3999")
Dim contains As Boolean = applicants.Contains(candidate)
Console.WriteLine($"{candidate.LastName} ({candidate.NationalId}) is on record: {contains}")
' The example prints the following output:
' Jones (199-29-3999) Is on record True
Комментарии
Реализация Equals метода предназначена для выполнения теста на равенство с другим объектом типа, таким же типом T, как и текущий объект. Метод Equals(T) вызывается в следующих обстоятельствах:
EqualsПри вызове метода иotherаргументе является строго типизированным объектом типаT. (Еслиotherтип не задан, вызывается базовыйTObject.Equals(Object) метод. Из двух методов IEquatable<T>.Equals обеспечивает немного более высокую производительность.)При вызове методов поиска ряда универсальных объектов коллекции. Ниже приведены некоторые из этих типов и их методов:
Некоторые универсальные перегрузки BinarySearch метода.
Методы List<T> поиска класса, включая List<T>.Contains(T), List<T>.IndexOfList<T>.LastIndexOfи List<T>.Remove.
Методы Dictionary<TKey,TValue> поиска класса, включая ContainsKey и Remove.
Методы поиска универсального LinkedList<T> класса, включая LinkedList<T>.Contains и Remove.
Другими словами, для обработки возможности хранения объектов класса в массиве или универсальном объекте коллекции рекомендуется реализовать IEquatable<T> так, чтобы объект можно было легко идентифицировать и управлять ими.
При реализации Equals метода определите равенство соответствующим образом для типа, указанного аргументом универсального типа. Например, если аргумент типа имеет Int32значение, определите равенство соответствующим образом для сравнения двух 32-разрядных целых чисел со знаком.
Примечания для тех, кто реализует этот метод
При реализации Equals(T)следует также переопределить реализации Equals(Object) базового класса и GetHashCode() обеспечить соответствие их поведения методу Equals(T) . При переопределении Equals(Object)реализация переопределения также вызывается в вызовах статического Equals(System.Object, System.Object) метода класса. Кроме того, следует перегрузить op_Equality операторы и op_Inequality операторы. Это гарантирует, что все тесты на равенство возвращают согласованные результаты, которые иллюстрируются в примере.