Menggunakan IEqualityComparer<T>
( EqualityComparer<T>.Default
kecuali 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>.GetHashCode
untuk menemukan kode hash, kemudian untuk semua elemen dengan kode hash yang sama, itu akan digunakan IEqualityComparer<T>.Equals
untuk 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 T
sendiri, 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 Foo
tidak mengimplementasikan IEqualityComparer<Foo>
) tetapi dalam tipe terpisah yang hanya digunakan untuk perbandingan.
- Menerapkan kesetaraan dalam tipe itu sendiri, dengan mengesampingkan
GetHashCode
dan 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>.CompareTo
atau IComparable.CompareTo
jika Anda menggunakan Comparer<T>.Default
.
IEqualityComparer<T>
dalam konstruktor atau implementasikan di kelasa
. msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx