her iki arayüz de nesneleri eşitlik açısından karşılaştırıyor gibi görünüyor, peki aralarındaki temel farklar nedir?
her iki arayüz de nesneleri eşitlik açısından karşılaştırıyor gibi görünüyor, peki aralarındaki temel farklar nedir?
Yanıtlar:
IEquatable<T>
eşitlik için.
IComparable<T>
sipariş için.
Greg D'nin cevabına ek olarak:
Kısmi bir sıralamanın anlamlı olduğu ve tüketicinin kesinlikle sıfır döndürdüğü için bunun nesnelerin eşit olduğu anlamına gelmediğini (sıralama amaçlarından başka herhangi bir şey için) anlamasını istediğiniz bir sınıf için uygulama IComparable
yapmadan uygulayabilirsiniz .IEquatable
CompareTo()
IComparable
burada tamamen uygunsuz. Sahip olduğunuz şey , yalnızca tek bir özel durumda geçerli olan çok özel bir sıralama. Bu tür durumlarda, bir generalin uygulanması IComparable
yanlıştır. Bunun IComparer
için var olanlar. Örneğin, insanlar anlamlı bir şekilde sıralanamaz. Ama olabilir maaşlarının onların ayakkabı numarası, onların çiller veya ağırlık sayılarına göre sipariş edilmelidir. Dolayısıyla, IComparer
tüm bu durumlar için farklı ' ler uygularız .
IEquatable için MSDN Sayfasında belirtildiği gibi :
IComparable arabirimi
CompareTo
, uygulama türünün örneklerinin sıralama düzenini belirleyen yöntemi tanımlar . IEquatable arabirimiEquals
, uygulama türünün örneklerinin eşitliğini belirleyen yöntemi tanımlar .
Equals
vs. CompareTo
IComparable <T>
nesneleri sıralamak veya sıralamak için kullanılabilen türe özgü bir karşılaştırma yöntemi tanımlar.
IEquatable <T>
Eşitliği belirlemek için uygulanabilecek genelleştirilmiş bir yöntemi tanımlar.
Diyelim ki kişi sınıfınız var
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();
.Ancak bu bir istisna yaratacaktır.
Framework bu nesneleri nasıl sıralayacağını bilmiyor. Uygulama IComparable
arayüzünü nasıl sıralayacağınızı söylemeniz gerekir .
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);
}
}
}
Bu, diziyi Sort()
yöntemle doğru şekilde sıralayacaktır .
Equals()
yöntemi kullanabilirsiniz .var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
Bu dönecektirfalse
çünkü Equals
yöntem iki nesneleri karşılaştırmak için nasıl bilmiyor. Bu nedenle, IEquatable
arayüzü uygulamanız ve çerçeveye karşılaştırmanın nasıl yapılacağını söylemeniz gerekir . Önceki örneğe genişletirsek, şöyle görünecektir.
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
jenerik kullanıyor <Person>
ve kullanmıyor IComparable
?
IComparable
doğru bir şekilde uygulanan bir nesneden çok özel bir durum karşılaştırmasına benziyor . Eğer anlamlı bir örnekle anlatabilir misinCompareTo(…) == 0
yok değil eşitlik ima? Kesinlikle yapamam. Aslında, arayüz sözleşmesi (MSDN göre) gerektiren buCompareTo(…) == 0
eşitliği ima eder. Senin, özel bir kullandıkça böyle bir durumda, açıkça söylemek gerekirseComparator
nesne yok değil uygulamakIComparable
.