¿Cómo puedo controlar cómo un objeto es ordenado por un hashset
Pregunta
Estoy usando un HashSet<T>
para almacenar una colección de objetos. Estos objetos ya tienen un identificador único de System.Guid
, por lo que prefieren la HashSet<>
sólo tiene que utilizar ese ID existente en lugar de tratar de averiguar cómo sí en Hash del objeto. ¿Cómo puedo reemplazar la estructura en hash y la fuerza de mi programa para utilizar la acumulación en el valor de identificación que el valor hash?
También digo que sé la Guid
de un objeto en mi HashSet<>
, ¿hay una manera de conseguir un objeto de una HashSet<T>
en base a este Guid
solo? O debería usar un diccionario en su lugar.
Solución
A HashSet<>
no se basa un par clave / valor, y no proporciona el acceso "por la tecla" - es sólo un conjunto de valores únicos, utilizando el hash para comprobar la contención muy rápidamente
Para usar un par clave / valor (a buscar a cabo por Guid
más adelante) la opción más sencilla sería un Dictionary<Guid,SomeType>
. El hash-código existente en Guid
debe estar bien (aunque si necesitaba (No es aquí) puede proporcionar una IEqualityComparer<T>
utilizar para hash.
Otros consejos
Anular la href="http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx" rel="nofollow noreferrer"> GetHashCode()
método para su objeto .
Por supuesto, hay una ligera arruga aquí ... GUID son más grandes que int32s, que .NET utiliza para hashcodes.
¿Por qué necesita para anular esto? parece que tal vez una optimización prematura.
Sí, sólo tiene que utilizar un diccionario. Una vez que desarrolla su aplicación, pasar por una fase de ajuste del rendimiento, donde se mide el rendimiento de todo el código. Si y sólo si esta función hash muestra como la boca del desagüe más grande debe considerar una estructura de datos con más prestaciones (si es que existe de todos modos): -)
Trate de buscar en System.KeyedCollection . Se le permite incluir el conocimiento del campo clave en la implementación de su colección.