Anda sudah mendapatkan definisi dasar tentang apa itu . Singkatnya, jika Anda menerapkan IEquatable<T>pada kelas T, Equalsmetode pada objek bertipe Tmemberitahu 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 Titu sendiri) harus menjadi standar de facto untuk mewakili keunikan objek / instansnya. HashSet<T>, Dictionary<T, U>(Mengingat GetHashCodeditimpa juga), Containsdi List<T>dll make penggunaan ini. Melaksanakan IEqualityComparer<T>pada Ttidak 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 Persondi 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 Ttidak 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>