Він використовує IEqualityComparer<T>
( EqualityComparer<T>.Default
якщо ви не вказали інший на конструкції).
Коли ви додасте елемент до набору, він знайде хеш-код за допомогою IEqualityComparer<T>.GetHashCode
і збереже як хеш-код, так і елемент (після перевірки, чи елемент вже є у наборі, звичайно).
Щоб шукати елемент вгору, він спочатку використовуватиме IEqualityComparer<T>.GetHashCode
знахідку хеш-коду, потім для всіх елементів з тим самим хеш-кодом він буде використовувати IEqualityComparer<T>.Equals
для порівняння фактичної рівності.
Це означає, що у вас є два варіанти:
- Передайте звичай
IEqualityComparer<T>
у конструктор. Це найкращий варіант, якщо ви не можете змінити T
себе або якщо ви хочете відношення рівності за замовчуванням (наприклад, "всі користувачі з негативним ідентифікатором користувача вважаються рівними"). Це майже ніколи не реалізується на самому типі (тобто Foo
не реалізує IEqualityComparer<Foo>
), а в окремому типі, який використовується лише для порівняння.
- Здійснюйте рівність у самому типі шляхом відміни
GetHashCode
та Equals(object)
. В ідеалі також реалізовувати IEquatable<T>
у тип, особливо якщо це тип значення. Ці методи будуть називатися порівнянням рівності за замовчуванням.
Зверніть увагу, як нічого з цього немає в плані упорядкованого порівняння - що має сенс, оскільки, безумовно, є ситуації, коли ви можете легко вказати рівність, але не загальне впорядкування. Це все те саме, що Dictionary<TKey, TValue>
, в основному.
Якщо ви хочете набір, який використовує впорядкування замість просто порівняння рівності, вам слід скористатися SortedSet<T>
з .NET 4 - що дозволяє вказати IComparer<T>
замість an IEqualityComparer<T>
. Для цього буде використано IComparer<T>.Compare
- який буде делеговано до IComparable<T>.CompareTo
або, IComparable.CompareTo
якщо ви використовуєте Comparer<T>.Default
.
IEqualityComparer<T>
в конструктор або реалізуйте її в класіa
. msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx