Anda sudah mendapatkan definisi dasar tentang apa itu . Singkatnya, jika Anda menerapkan IEquatable<T>
pada kelas T
, Equals
metode pada objek bertipe T
memberitahu Anda jika objek itu sendiri (yang sedang diuji untuk kesetaraan) sama dengan contoh lain dari jenis yang sama T
. Sedangkan, IEqualityComparer<T>
adalah untuk menguji kesetaraan dua contoh T
, biasanya di luar lingkup contoh T
.
Untuk apa mereka bisa membingungkan pada awalnya. Dari definisi itu harus jelas bahwa karenanya IEquatable<T>
(didefinisikan dalam kelas T
itu sendiri) harus menjadi standar de facto untuk mewakili keunikan objek / instansnya. HashSet<T>
, Dictionary<T, U>
(Mengingat GetHashCode
ditimpa juga), Contains
di List<T>
dll make penggunaan ini. Melaksanakan IEqualityComparer<T>
pada T
tidak membantu kasus-kasus umum yang disebutkan di atas. Selanjutnya, ada sedikit nilai untuk diterapkan IEquatable<T>
pada kelas lain selain T
. Ini:
class MyClass : IEquatable<T>
jarang masuk akal.
Di samping itu
class T : IEquatable<T>
{
//override ==, !=, GetHashCode and non generic Equals as well
public bool Equals(T other)
{
//....
}
}
adalah bagaimana hal itu harus dilakukan.
IEqualityComparer<T>
dapat bermanfaat saat Anda memerlukan validasi khusus kesetaraan, tetapi tidak sebagai aturan umum. Misalnya, dalam kelas Person
di beberapa titik Anda mungkin perlu menguji kesetaraan dua orang berdasarkan usia mereka. Dalam hal ini Anda dapat melakukan:
class Person
{
public int Age;
}
class AgeEqualityTester : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj.Age.GetHashCode;
}
}
Untuk mengujinya, coba
var people = new Person[] { new Person { age = 23 } };
Person p = new Person() { age = 23 };
print people.Contains(p); //false;
print people.Contains(p, new AgeEqualityTester()); //true
Demikian pula IEqualityComparer<T>
pada T
tidak masuk akal.
class Person : IEqualityComparer<Person>
Benar ini bekerja, tetapi tidak terlihat baik di mata dan mengalahkan logika.
Biasanya yang Anda butuhkan adalah IEquatable<T>
. Idealnya, Anda hanya dapat memiliki satu IEquatable<T>
sementara beberapa IEqualityComparer<T>
dimungkinkan berdasarkan kriteria yang berbeda.
Itu IEqualityComparer<T>
dan IEquatable<T>
persis analog dengan Comparer<T>
dan IComparable<T>
yang digunakan untuk tujuan perbandingan daripada menyamakan; thread yang bagus di sini di mana saya menulis jawaban yang sama :)
EqualityComparer<T>
alih-alih mengimplementasikan antarmuka "karenaEqualityComparer<T>
menguji kesetaraan menggunakanIEquatable<T>