IEquatable<T>.Equals(T) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Určuje, zda je aktuální objekt roven jinému objektu stejného typu.
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
Parametry
- other
- T
Objekt, který chcete porovnat s tímto objektem.
Návraty
truepokud je aktuální objekt roven parametruother; v opačném případě . false
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
Pokud je uložen Person v objektu List<T>, Contains používá jeho Equals implementaci k vyhledání shody.
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
Poznámky
Implementace Equals metody je určena k provedení testu rovnosti s jiným objektem typu T, stejného typu jako aktuální objekt. Metoda Equals(T) se volá za následujících okolností:
EqualsPři zavolání metody aotherargument je objekt typu silnéhoTtypu . (Pokudothernení typuT, je volána základní Object.Equals(Object) metoda. Z těchto dvou metod IEquatable<T>.Equals nabízí mírně lepší výkon.)Když jsou volány vyhledávací metody řady obecných objektů kolekce. Mezi tyto typy a jejich metody patří:
Některá obecná přetížení BinarySearch metody.
Vyhledávací metody List<T> třídy, včetně List<T>.Contains(T), List<T>.IndexOf, List<T>.LastIndexOfa List<T>.Remove.
Metody vyhledávání Dictionary<TKey,TValue> třídy, včetně ContainsKey a Remove.
Vyhledávací metody obecné LinkedList<T> třídy, včetně LinkedList<T>.Contains a Remove.
Jinými slovy, aby bylo možné zvládnout možnost, že objekty třídy budou uloženy v poli nebo obecné kolekci objektu, je vhodné implementovat IEquatable<T> , aby bylo možné objekt snadno identifikovat a manipulovat.
Při implementaci Equals metody definujte rovnost odpovídajícím způsobem pro typ určený argumentem obecného typu. Pokud je Int32například argument typu , definujte rovnost odpovídajícím způsobem pro porovnání dvou 32bitových celých celých čísel se signepsi.
Poznámky pro implementátory
Pokud implementujete Equals(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 pro rovnost vrátí konzistentní výsledky, které ilustruje příklad.