Ele usa um IEqualityComparer<T>
(a EqualityComparer<T>.Default
menos que você especifique um diferente na construção).
Quando você adiciona um elemento ao conjunto, ele encontra o código hash usando IEqualityComparer<T>.GetHashCode
e 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>.GetHashCode
para 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>.Equals
para 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 T
si 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
GetHashCode
e 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>.CompareTo
ou IComparable.CompareTo
se 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