Utiliza un IEqualityComparer<T>
(a EqualityComparer<T>.Default
menos que especifique uno diferente en la construcción).
Cuando agrega un elemento al conjunto, encontrará el código hash usando IEqualityComparer<T>.GetHashCode
y almacenará tanto el código hash como el elemento (después de verificar si el elemento ya está en el conjunto, por supuesto).
Para buscar un elemento, primero usará IEqualityComparer<T>.GetHashCode
para encontrar el código hash, luego, para todos los elementos con el mismo código hash, usará IEqualityComparer<T>.Equals
para comparar la igualdad real.
Eso significa que tienes dos opciones:
- Pase una costumbre
IEqualityComparer<T>
al constructor. Esta es la mejor opción si no puede modificarse a T
sí mismo o si desea una relación de igualdad no predeterminada (por ejemplo, "todos los usuarios con una ID de usuario negativa se consideran iguales"). Esto casi nunca se implementa en el tipo en sí (es decir, Foo
no se implementa IEqualityComparer<Foo>
), sino en un tipo separado que solo se usa para comparaciones.
- Implemente la igualdad en el tipo mismo, anulando
GetHashCode
y Equals(object)
. Idealmente, implemente también IEquatable<T>
en el tipo, particularmente si es un tipo de valor. El método de comparación de igualdad predeterminado llamará a estos métodos.
Tenga en cuenta que nada de esto es en términos de una comparación ordenada , lo que tiene sentido, ya que ciertamente hay situaciones en las que puede especificar fácilmente la igualdad, pero no una ordenación total. Todo esto es lo mismo que Dictionary<TKey, TValue>
, básicamente.
Si desea un conjunto que use el ordenamiento en lugar de solo las comparaciones de igualdad, debe usarlo SortedSet<T>
desde .NET 4, que le permite especificar un en IComparer<T>
lugar de un IEqualityComparer<T>
. Esto usará IComparer<T>.Compare
, lo que delegará IComparable<T>.CompareTo
o IComparable.CompareTo
si está usando Comparer<T>.Default
.
IEqualityComparer<T>
en el constructor o impleméntelo en la clasea
. msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx