kedua antarmuka tampaknya membandingkan objek untuk persamaan, jadi apa perbedaan utama di antara keduanya?
kedua antarmuka tampaknya membandingkan objek untuk persamaan, jadi apa perbedaan utama di antara keduanya?
Jawaban:
IEquatable<T>
untuk kesetaraan.
IComparable<T>
untuk memesan.
Selain jawaban Greg D:
Anda dapat mengimplementasikan IComparable
tanpa mengimplementasikan IEquatable
untuk kelas yang pengurutan parsial masuk akal, dan di mana Anda sangat ingin konsumen menyimpulkan bahwa hanya karena CompareTo()
mengembalikan nol, ini tidak berarti bahwa objeknya sama (untuk apa pun selain tujuan pengurutan).
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 jenderal IComparable
adalah salah. Untuk inilah IComparer
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 berbeda IComparer
karena semua kasus ini.
Seperti yang dinyatakan di Halaman MSDN untuk IEquatable :
Antarmuka IComparable mendefinisikan
CompareTo
metode, yang menentukan urutan pengurutan instance dari tipe implementasi. Antarmuka IEquatable mendefinisikanEquals
metode, yang menentukan persamaan contoh dari tipe implementasi.
Equals
vs. CompareTo
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
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };
List<Person> people = new List<Person> { p1, p2, p3, p4 };
people.Sort();
.Tapi ini akan membuat pengecualian.
Kerangka tidak tahu cara mengurutkan objek ini. Anda perlu memberi tahu cara mengurutkan IComparable
antarmuka penerapan .
public class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person otherPerson = obj as Person;
if (otherPerson == null)
{
throw new ArgumentNullException();
}
else
{
return Age.CompareTo(otherPerson.Age);
}
}
}
Ini akan mengurutkan array dengan benar dengan Sort()
metode.
Equals()
metode.var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
Ini akan kembalifalse
karena Equals
metode tidak tahu bagaimana membandingkan dua objek. Oleh karena itu, Anda perlu mengimplementasikan IEquatable
antarmuka dan memberi tahu framework cara melakukan perbandingan. Memperluas contoh sebelumnya akan terlihat seperti ini.
public class Person : IComparable, IEquatable<Person>
{
//Some code hidden
public bool Equals(Person other)
{
if (Age == other.Age && Name == other.Name)
{
return true;
}
else
{
return false;
}
}
}
IEquatable
menggunakan generik <Person>
dan IComparable
tidak?
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
.