Bir kullanır IEqualityComparer<T>( EqualityComparer<T>.Defaultinşaatta farklı bir tane belirtmediğiniz sürece).
Kümeye bir eleman eklediğinizde, karma kodunu kullanarak bulacak IEqualityComparer<T>.GetHashCodeve hem karma kodunu hem de elemanı depolayacaktır (elbette elemanın zaten kümede olup olmadığını kontrol ettikten sonra).
Bir öğeyi yukarı aramak için, önce IEqualityComparer<T>.GetHashCodekarma kodunu bulmak için, ardından aynı karma koduna sahip tüm öğeler IEqualityComparer<T>.Equalsiçin gerçek eşitliği karşılaştırmak için kullanacaktır .
Bu, iki seçeneğiniz olduğu anlamına gelir:
- Yapıcıya bir gelenek
IEqualityComparer<T>geçirin. TKendini değiştiremiyorsanız veya varsayılan olmayan bir eşitlik ilişkisi istiyorsanız bu en iyi seçenektir (örneğin, "negatif kullanıcı kimliğine sahip tüm kullanıcılar eşit kabul edilir"). Bu, neredeyse hiçbir zaman türün kendisine uygulanmaz (yani Foouygulanmaz IEqualityComparer<Foo>), ancak yalnızca karşılaştırmalar için kullanılan ayrı bir türdedir.
- Geçersiz kılarak, tip kendisinde eşitliğini uygulamak
GetHashCodeve Equals(object). İdeal IEquatable<T>olarak, özellikle bir değer türüyse, tür içinde de uygulayın . Bu yöntemler, varsayılan eşitlik karşılaştırıcısı tarafından çağrılacaktır.
Bunların hiçbirinin sıralı bir karşılaştırma açısından nasıl olmadığına dikkat edin - bu mantıklıdır, çünkü kesinlikle eşitliği kolayca belirleyebileceğiniz ancak toplam bir sıralamayı belirtemeyeceğiniz durumlar vardır. Dictionary<TKey, TValue>Temelde bunların hepsi aynı .
Yalnızca eşitlik karşılaştırmaları yerine sıralama kullanan bir küme istiyorsanız SortedSet<T>, .NET 4'ten kullanmalısınız - bu IComparer<T>, bir IEqualityComparer<T>. Bu, kullanacak IComparer<T>.Compare- hangisine IComparable<T>.CompareToya IComparable.CompareToda kullanıyorsanız , yetki verecektir Comparer<T>.Default.
IEqualityComparer<T>veya sınıfta uygulayına. msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx