Zaten ne olduklarının temel tanımına zaten sahipsiniz . Uygulamak Kısacası, IEquatable<T>sınıf T, Equalstip bir nesne üzerinde bir yöntem Tnesnenin kendisi (eşitlik test edilen bir) aynı türde başka bir örneğine eşit olup olmadığını bildirir T. Halbuki, tipik olarak, kapsamının dışında kalan IEqualityComparer<T>herhangi iki örneğinin eşitliğini sınamak içindir .TT
Gelince ne oldukları için ilk başta kafa karıştırıcı olabilir. Tanımdan, bu nedenle IEquatable<T>(sınıfın Tkendisinde tanımlanan ), nesnelerinin / örneklerinin benzersizliğini temsil etmek için fiili standart olması gerektiği açık olmalıdır. HashSet<T>, Dictionary<T, U>(Düşünüyor GetHashCode, hem de geçersiz kılınır) Containsüzerine List<T>bunun vb yapmak kullanımı. Uygulama IEqualityComparer<T>üzerinde Tyukarıda belirtilen genel durumları yardımcı olmuyor. Daha sonra, IEquatable<T>başka herhangi bir sınıfa uygulamak için çok az değer vardır T. Bu:
class MyClass : IEquatable<T>
nadiren mantıklı.
Diğer yandan
class T : IEquatable<T>
{
//override ==, !=, GetHashCode and non generic Equals as well
public bool Equals(T other)
{
//....
}
}
nasıl yapılması gerektiğidir.
IEqualityComparer<T>genel bir kural olarak değil, eşitliğin özel olarak onaylanmasını istediğinizde yararlı olabilir. Örneğin, bir Personnoktada bir sınıfta iki kişinin yaşlarına göre eşitliğini test etmeniz gerekebilir. Bu durumda şunları yapabilirsiniz:
class Person
{
public int Age;
}
class AgeEqualityTester : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj.Age.GetHashCode;
}
}
Test etmek için deneyin
var people = new Person[] { new Person { age = 23 } };
Person p = new Person() { age = 23 };
print people.Contains(p); //false;
print people.Contains(p, new AgeEqualityTester()); //true
Benzer şekilde IEqualityComparer<T>üzerinde bir Tanlam ifade etmiyor.
class Person : IEqualityComparer<Person>
Doğru çalışıyor, ama gözler için iyi görünmüyor ve mantığı yendi.
Genellikle ihtiyacınız olan şey IEquatable<T>. Ayrıca ideal olarak sadece bir tane IEquatable<T>birdenIEqualityComparer<T> , farklı kriterlere göre mümkündür.
IEqualityComparer<T>Ve IEquatable<T>tam olarak benzer olan Comparer<T>ve IComparable<T>, karşılaştırma amacıyla yerine denk daha için kullanıldığı; burada aynı cevabı yazdığım iyi bir konu :)
EqualityComparer<T>"EqualityComparer<T>eşitliği kullanarak testlerIEquatable<T>