Він використовує 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