IEquatable<T>.Equals(T) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menunjukkan apakah objek saat ini sama dengan objek lain dengan jenis yang sama.
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
Parameter
- other
- T
Objek untuk dibandingkan dengan objek ini.
Mengembalikan
true jika objek saat ini sama dengan other parameter; jika tidak, false.
Contoh
Contoh berikut menunjukkan implementasi Person parsial IEquatable<T> kelas yang mengimplementasikan dan memiliki dua properti, LastName dan NationalId.
NationalId dianggap sebagai pengidentifikasi unik, oleh karena itu Equals metode mengembalikan True jika NationalId properti dari dua Person objek identik; jika tidak, metode mengembalikan False.
(Perhatikan bahwa contoh F# tidak menangani null nilai untuk Person instans.)
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 Ketika disimpan dalam List<T>, Contains menggunakan implementasinya Equals untuk mencari kecocokan.
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
Keterangan
Implementasi Equals metode ini dimaksudkan untuk melakukan pengujian untuk kesetaraan dengan objek jenis Tlain , jenis yang sama dengan objek saat ini. Metode Equals(T) ini dipanggil dalam keadaan berikut:
Ketika metode dipanggil
Equalsdanotherargumen adalah objek jenisTyang sangat ditik . (Jikaotherbukan jenisT, metode dasar Object.Equals(Object) dipanggil. Dari dua metode tersebut, IEquatable<T>.Equals menawarkan performa yang sedikit lebih baik.)Ketika metode pencarian dari sejumlah objek koleksi generik dipanggil. Beberapa jenis ini dan metodenya meliputi yang berikut ini:
Beberapa kelebihan BinarySearch umum metode.
Metode List<T> pencarian kelas, termasuk List<T>.Contains(T), , List<T>.IndexOfList<T>.LastIndexOf, dan List<T>.Remove.
Metode Dictionary<TKey,TValue> pencarian kelas, termasuk ContainsKey dan Remove.
Metode pencarian kelas generik LinkedList<T> , termasuk LinkedList<T>.Contains dan Remove.
Dengan kata lain, untuk menangani kemungkinan bahwa objek kelas akan disimpan dalam array atau objek pengumpulan generik, ada baiknya untuk diimplementasikan IEquatable<T> sehingga objek dapat dengan mudah diidentifikasi dan dimanipulasi.
Saat menerapkan Equals metode , tentukan kesetaraan dengan tepat untuk jenis yang ditentukan oleh argumen jenis generik. Misalnya, jika argumen jenis adalah Int32, tentukan kesetaraan dengan tepat untuk perbandingan dua bilangan bulat bertanda tangan 32-bit.
Catatan Bagi Implementer
Jika Anda menerapkan Equals(T), Anda juga harus mengambil alih implementasi Equals(Object) kelas dasar dan GetHashCode() sehingga perilakunya konsisten dengan metode .Equals(T) Jika Anda mengambil alih Equals(Object), implementasi yang ditimpa juga dipanggil dalam panggilan ke metode statis Equals(System.Object, System.Object) di kelas Anda. Selain itu, Anda harus membebani op_Equality operator dan op_Inequality secara berlebihan. Ini memastikan bahwa semua pengujian untuk kesetaraan mengembalikan hasil yang konsisten, yang diilustrasikan contoh.