kedua antarmuka tampaknya membandingkan objek untuk persamaan, jadi apa perbedaan utama di antara keduanya?
c#
interface
icomparable
iequatable
SoftwareGeek
sumber
sumber
IComparable
dengan benar. Anda bisa datang dengan contoh yang berarti di manaCompareTo(…) == 0
tidak tidak menyiratkan kesetaraan? Saya pasti tidak bisa. Faktanya, kontrak antarmuka (sesuai MSDN) mensyaratkan yangCompareTo(…) == 0
menyiratkan kesetaraan. Terus terang, dalam kasus seperti Anda, gunakan khususComparator
objek, jangan tidak menerapkanIComparable
.IComparable
sama sekali tidak pantas di sini. Apa yang Anda dapatkan adalah urutan yang sangat khusus yang hanya berlaku dalam satu situasi khusus. Untuk situasi seperti itu, menerapkan seorang jenderalIComparable
adalah salah. Untuk inilahIComparer
ada. Misalnya, orang tidak bisa diatur secara bermakna. Tetapi mereka dapat dipesan berdasarkan gaji, ukuran sepatu, jumlah bintik atau beratnya. Oleh karena itu, kami akan menerapkan berbedaIComparer
karena semua kasus ini.Seperti yang dinyatakan di Halaman MSDN untuk IEquatable :
Equals
vs.CompareTo
sumber
IComparable <T>
mendefinisikan metode perbandingan khusus tipe yang dapat digunakan untuk memesan atau mengurutkan objek.IEquatable <T>
mendefinisikan metode umum yang dapat digunakan untuk diterapkan dalam menentukan kesetaraan.Katakanlah Anda memiliki kelas Person
Untuk mengurutkan benda-benda ini dapat Anda gunakan
people.Sort();
.Tapi ini akan membuat pengecualian.
Kerangka tidak tahu cara mengurutkan objek ini. Anda perlu memberi tahu cara mengurutkan
IComparable
antarmuka penerapan .Ini akan mengurutkan array dengan benar dengan
Sort()
metode.Selanjutnya untuk membandingkan dua objek, Anda dapat menggunakan
Equals()
metode.Ini akan kembali
false
karenaEquals
metode tidak tahu bagaimana membandingkan dua objek. Oleh karena itu, Anda perlu mengimplementasikanIEquatable
antarmuka dan memberi tahu framework cara melakukan perbandingan. Memperluas contoh sebelumnya akan terlihat seperti ini.sumber
IEquatable
menggunakan generik<Person>
danIComparable
tidak?