Bir kullanır IEqualityComparer<T>
( EqualityComparer<T>.Default
inşaatta farklı bir tane belirtmediğiniz sürece).
Kümeye bir eleman eklediğinizde, karma kodunu kullanarak bulacak IEqualityComparer<T>.GetHashCode
ve 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>.GetHashCode
karma kodunu bulmak için, ardından aynı karma koduna sahip tüm öğeler IEqualityComparer<T>.Equals
iç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. T
Kendini 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 Foo
uygulanmaz 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
GetHashCode
ve 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>.CompareTo
ya IComparable.CompareTo
da 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