Ele usa um IEqualityComparer<T>(a EqualityComparer<T>.Defaultmenos que você especifique um diferente na construção).
Quando você adiciona um elemento ao conjunto, ele encontra o código hash usando IEqualityComparer<T>.GetHashCodee armazena o código hash e o elemento (depois de verificar se o elemento já está no conjunto, é claro).
Para procurar um elemento, ele primeiro usará o IEqualityComparer<T>.GetHashCodepara encontrar o código de hash e, em seguida, para todos os elementos com o mesmo código de hash, ele será usado IEqualityComparer<T>.Equalspara comparar a igualdade real.
Isso significa que você tem duas opções:
- Passe um costume
IEqualityComparer<T>para o construtor. Essa é a melhor opção se você não puder modificar a Tsi mesmo ou se desejar uma relação de igualdade não padrão (por exemplo, "todos os usuários com um ID de usuário negativo são considerados iguais"). Isso quase nunca é implementado no próprio tipo (isto Fooé, não implementa IEqualityComparer<Foo>), mas em um tipo separado, que é usado apenas para comparações.
- Implemente a igualdade no próprio tipo, substituindo
GetHashCodee Equals(object). Idealmente, implemente também IEquatable<T>no tipo, principalmente se for um tipo de valor. Esses métodos serão chamados pelo comparador de igualdade padrão.
Observe como nada disso é em termos de comparação ordenada - o que faz sentido, pois certamente existem situações em que você pode especificar facilmente a igualdade, mas não uma ordenação total. Isso é tudo igual Dictionary<TKey, TValue>, basicamente.
Se você deseja um conjunto que use ordenação em vez de apenas comparações de igualdade, use o SortedSet<T>.NET 4 - que permite especificar um em IComparer<T>vez de um IEqualityComparer<T>. Isso usará IComparer<T>.Compare- que delegará IComparable<T>.CompareToou IComparable.CompareTose você estiver usando Comparer<T>.Default.
IEqualityComparer<T>no construtor ou implementá-lo na classea. msdn.microsoft.com/pt-br/library/bb301504(v=vs.110).aspx