Menggunakan IEqualityComparer<T>( EqualityComparer<T>.Defaultkecuali Anda menentukan yang berbeda pada konstruksi).
Ketika Anda menambahkan elemen ke set, itu akan menemukan kode hash menggunakan IEqualityComparer<T>.GetHashCode, dan menyimpan kode hash dan elemen (setelah memeriksa apakah elemen sudah di set, tentu saja).
Untuk mencari elemen, pertama-tama akan menggunakan IEqualityComparer<T>.GetHashCodeuntuk menemukan kode hash, kemudian untuk semua elemen dengan kode hash yang sama, itu akan digunakan IEqualityComparer<T>.Equalsuntuk membandingkan kesetaraan yang sebenarnya.
Itu berarti Anda memiliki dua opsi:
- Lewati kebiasaan
IEqualityComparer<T>ke konstruktor. Ini adalah opsi terbaik jika Anda tidak dapat memodifikasi Tsendiri, atau jika Anda ingin hubungan kesetaraan non-standar (misalnya "semua pengguna dengan ID pengguna negatif dianggap sama"). Ini hampir tidak pernah diimplementasikan pada tipe itu sendiri (yaitu Footidak mengimplementasikan IEqualityComparer<Foo>) tetapi dalam tipe terpisah yang hanya digunakan untuk perbandingan.
- Menerapkan kesetaraan dalam tipe itu sendiri, dengan mengesampingkan
GetHashCodedan Equals(object). Idealnya, implementasikan IEquatable<T>dalam tipe juga, terutama jika itu tipe nilai. Metode-metode ini akan dipanggil oleh pembanding kesetaraan default.
Perhatikan bagaimana tidak satu pun dari ini dalam hal perbandingan yang dipesan - yang masuk akal, karena pasti ada situasi di mana Anda dapat dengan mudah menentukan kesetaraan tetapi bukan total pemesanan. Ini semua sama dengan Dictionary<TKey, TValue>, pada dasarnya.
Jika Anda menginginkan set yang menggunakan pemesanan alih-alih hanya perbandingan kesetaraan, Anda harus menggunakan SortedSet<T>dari .NET 4 - yang memungkinkan Anda untuk menentukan IComparer<T>bukan IEqualityComparer<T>. Ini akan menggunakan IComparer<T>.Compare- yang akan didelegasikan ke IComparable<T>.CompareToatau IComparable.CompareTojika Anda menggunakan Comparer<T>.Default.
IEqualityComparer<T>dalam konstruktor atau implementasikan di kelasa. msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx