Zaten ne olduklarının temel tanımına zaten sahipsiniz . Uygulamak Kısacası, IEquatable<T>
sınıf T
, Equals
tip bir nesne üzerinde bir yöntem T
nesnenin 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 .T
T
Gelince ne oldukları için ilk başta kafa karıştırıcı olabilir. Tanımdan, bu nedenle IEquatable<T>
(sınıfın T
kendisinde 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 T
yukarı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 Person
noktada 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 T
anlam 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>