Saya mencoba mencari tahu antarmuka mana yang perlu saya terapkan. Mereka berdua pada dasarnya melakukan hal yang sama. Kapan saya akan menggunakannya?
.net
icomparable
icomparer
Mikha
sumber
sumber
Jawaban:
Mereka tidak persis sama seperti
IComparer<T>
yang diimplementasikan pada tipe yang mampu membandingkan dua objek yang berbeda saatIComparable<T>
diimplementasikan pada tipe yang mampu membandingkan dirinya dengan contoh lain dari tipe yang sama.Saya cenderung menggunakan
IComparable<T>
saat-saat ketika saya perlu tahu bagaimana instance lain berhubungan denganthis
instance.IComparer<T>
berguna untuk menyortir koleksi sebagaiIComparer<T>
stand di luar perbandingan.sumber
IComparable
seperti saya sebanding . yang berarti saya bisa dibandingkan dengan sesuatu yang lain. Dan membacaIComparer
karena saya seorang pembanding, saya hanya membandingkan yang berarti saya membandingkan beberapa hal.Gunakan
IComparable<T>
jika kelas memiliki perbandingan intrinsik.Gunakan
IComparer<T>
jika Anda menginginkan metode perbandingan selain perbandingan intrinsik kelas, jika ada.sumber
Itu tergantung pada entitasnya. Sebagai contoh mengikuti kelas seperti "Mahasiswa", akan masuk akal untuk memiliki IComparable berdasarkan Name.
Tetapi jika guru 'A' ingin membandingkan siswa berdasarkan MathScore, dan guru 'B' ingin membandingkan siswa berdasarkan EnglishScore. Ide bagus untuk mengimplementasikan IComparer secara terpisah. (Lebih mirip pola strategi)
sumber
Itu semua tergantung pada apakah tipe Anda bisa berubah atau tidak. Anda sebaiknya hanya mengimplementasikan IComparable pada tipe yang tidak bisa berubah. Perhatikan bahwa jika Anda mengimplementasikan IComparable, Anda harus mengganti Sama, bersama dengan operator ==,! =, <Dan> (lihat peringatan Analisis Kode CA1036).
Mengutip Dave G dari postingan blog ini :
sumber
Penjelasan Sederhana melalui sebuah cerita
Bola basket sekolah menengah. Ini adalah pilihan halaman sekolah untuk tim. Saya ingin mendapatkan orang tertinggi / terbaik / tercepat di tim saya. Apa yang saya lakukan?
IComparer Interface - Bandingkan dua orang yang terpisah
Compare(Fred, John)
dan itu memuntahkan siapa yang lebih baik.Bagaimana dengan IComparable? - Bandingkan diri Anda dengan orang lain
Apakah Anda pernah menggunakan FB baru-baru ini? Anda melihat orang lain melakukan hal-hal keren: berkeliling dunia, membuat penemuan, sementara saya melakukan sesuatu yang tidak terlalu keren - yang kami lakukan adalah memanfaatkan antarmuka IComparable.
Bagaimana dengan Kelas Pembanding?
Kelas Comparer adalah kelas dasar abstrak yang mengimplementasikan antarmuka IComparer. Anda harus turun dari kelas ini untuk mendapatkan implementasi yang konkret. bagaimanapun, Microsoft menganjurkan agar Anda DO menggunakan kelas Comparer daripada mengimplementasikan antarmuka IComparer:
Ringkasan
Semoga ceritanya membantu Anda mengingat.
sumber
Seperti yang dikatakan orang lain, mereka tidak melakukan hal yang sama.
Bagaimanapun, hari ini saya cenderung tidak menggunakan IComparer. Mengapa saya harus? Tanggung jawabnya (entitas eksternal yang digunakan untuk membandingkan dua objek) dapat ditangani lebih bersih dengan ekspresi lambda, mirip dengan cara kerja sebagian besar metode LINQ. Tulis lambda cepat yang mengambil objek untuk dibandingkan sebagai argumen, dan mengembalikan bool. Dan jika objek mendefinisikan operasi perbandingan intrinsiknya sendiri, ia dapat mengimplementasikan IComparable sebagai gantinya.
sumber
IComparable mengatakan suatu objek dapat dibandingkan dengan yang lain. IComparer adalah objek yang dapat membandingkan dua item.
sumber
IComparer adalah antarmuka yang digunakan untuk mengurutkan Array, antarmuka ini akan memaksa kelas untuk mengimplementasikan metode Compare (T x, T y), yang akan membandingkan kedua objek tersebut. Instance dari kelas yang mengimplementasikan antarmuka ini digunakan dalam pengurutan Array.
IComparable adalah antarmuka yang diimplementasikan dalam tipe yang perlu membandingkan dua objek dari tipe yang sama, Antarmuka yang sebanding ini akan memaksa kelas untuk mengimplementasikan metode berikut CompareTo (T obj)
IEqualityComparer adalah antarmuka yang digunakan untuk menemukan objek apakah itu Sama atau tidak, Sekarang kita akan melihat ini dalam contoh di mana kita harus menemukan Perbedaan Objek dalam koleksi. Antarmuka ini akan mengimplementasikan metode Equals (T obj1, T obj2)
Sekarang kita ambil Contoh kita memiliki kelas Karyawan, berdasarkan kelas ini kita harus membuat Koleksi. Sekarang kami memiliki persyaratan berikut.
Sortir Array menggunakan Array class 2. Perlu koleksi menggunakan Linq: Hapus Duplikat, Urutkan dari atas ke bawah, Hapus satu id karyawan
public class EmployeeIdSorter: IComparer {public int Bandingkan (Karyawan x, Karyawan y) {if (x.Id <y.Id) return 1; else if (x.Id> y.Id) return -1; lain kembali 0; }}
Untuk info lebih lanjut lihat di bawah ini http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable-and.html
sumber