IEquatable<T>.Equals(T) Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Geçerli nesnenin aynı türdeki başka bir nesneye eşit olup olmadığını gösterir.
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
Parametreler
- other
- T
Bu nesneyle karşılaştıracak bir nesne.
Döndürülenler
true geçerli nesne parametresine other eşitse; değilse, false.
Örnekler
Aşağıdaki örnek, uygulayan ve iki özelliği PersonIEquatable<T>olan LastName bir NationalId sınıfın kısmi uygulamasını ve öğesini gösterir.
NationalIdbenzersiz bir tanımlayıcı olarak kabul edilir, bu nedenle Equals iki nesnenin True özelliği aynıysa yöntemi döndürürNationalId; aksi takdirde döndürürPersonFalse.
(F# örneğinin örneklerin değerlerini null işlemediğini Person unutmayın.)
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
bir Person içinde List<T>Contains depolandığında, eşleşme aramak için uygulamasını Equals kullanır.
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
Açıklamalar
yönteminin Equals uygulanması, geçerli nesneyle aynı türde Tbaşka bir nesneyle eşitlik testi gerçekleştirmeye yöneliktir.
Equals(T) yöntemi aşağıdaki durumlarda çağrılır:
Equalsyöntemi çağrıldığında veotherbağımsız değişken türüTkesin olarak belirlenmiş bir nesne olduğunda. (türündeotherdeğilseT, temel Object.Equals(Object) yöntem çağrılır. İki yöntemden IEquatable<T>.Equals biraz daha iyi performans sunar.)Bir dizi genel koleksiyon nesnesinin arama yöntemleri çağrıldığında. Bu türlerden bazıları ve yöntemleri şunlardır:
yönteminin genel aşırı yüklemelerinden BinarySearch bazıları.
sınıfının , , List<T>ve dahil olmak üzere List<T>.Contains(T)arama yöntemleriList<T>.IndexOf.List<T>.LastIndexOfList<T>.Remove
ve Dictionary<TKey,TValue>dahil olmak üzere ContainsKey sınıfının arama yöntemleriRemove.
ve LinkedList<T>dahil olmak üzere LinkedList<T>.Contains genel Remove sınıfın arama yöntemleri.
Başka bir deyişle, bir sınıfın nesnelerinin bir dizide veya genel bir koleksiyon nesnesinde depolanma olasılığını işlemek için, nesnenin kolayca tanımlanabilmesi ve işlenebilmesi için uygulamak IEquatable<T> iyi bir fikirdir.
yöntemini uygularken Equals , genel tür bağımsız değişkeni tarafından belirtilen tür için eşitliği uygun şekilde tanımlayın. Örneğin, tür bağımsız değişkeni ise Int32, iki 32 bit işaretli tamsayı karşılaştırması için eşitliği uygun şekilde tanımlayın.
Uygulayanlara Notlar
uygularsanız Equals(T), ve temel sınıf uygulamalarını Equals(Object)GetHashCode() da geçersiz kılmalısınız, böylece davranışları yönteminkiyle Equals(T) tutarlı olur. geçersiz kılarsanız Equals(Object)geçersiz kılınan uygulamanız, sınıfınızdaki statik Equals(System.Object, System.Object) yönteme yapılan çağrılarda da çağrılır. Ayrıca ve op_Equality işleçlerini op_Inequality aşırı yüklemelisiniz. Bu, eşitlik için tüm testlerin tutarlı sonuçlar döndürmesini sağlar ve bu örnekte gösterilmiştir.