Me gustaría saber de la comunidad cómo debo implementar GetHashCode (o anularlo) para mi objeto. Entiendo que debo hacerlo si anulo el método igual. Lo he implementado una buena cantidad de veces, a veces simplemente llamando al método base. Entiendo que mi objeto debe ser igual a otra instancia del objeto si contiene los mismos detalles (miembros). ¿Cuál es la mejor manera de obtener un código hash de los miembros de la clase?Implementando GetHashCode correctamente
Respuesta
Digamos que su clase es el siguiente:
class Frob {
public string Foo { get; set; }
public int Bar { get; set; }
public double FooBar { get; set; }
}
Digamos que usted define es igual modo que dos instancias de Frob
son iguales si su Foo
y su Bar
son iguales, pero FooBar
no importa.
Luego debe definir GetHashCode
en términos de Foo
y Bar
. Una forma es la siguiente:
return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();
Básicamente, lo que desea es incorporar todos los campos que intervienen en la definición de la igualdad. Una forma es seguir acumulando y multiplicando por 17 como lo hice. Es rápido, simple, correcto, y por lo general ofrece una buena distribución.
Tengo la sensación de que esta debería ser una pregunta en sí misma, pero ¿por qué 23? –
Factor primo para hacer que {2,1} y {1,2} difieran. –
tal vez indique que GetHashCode solo le dice si dos objetos ** podrían ** considerarse iguales. Todavía existe la posibilidad de una colisión hash. – geofftnz
- 1. ¿Estoy implementando correctamente el algoritmo "Heapify"?
- 2. Ejecución GetHashCode
- 3. GetHashCode() con^
- 4. GetHashCode Equality
- 5. GetHashCode (llave) y int.MaxValue
- 6. GetHashCode Método de extensión
- 7. Cuándo anular GetHashCode()?
- 8. GetHashCode en campos nulos?
- 9. Anulación de GetHashCode
- 10. GetHashCode() desde booleanos única
- 11. ¿Por qué importar GetHashCode()?
- 12. C# Reemplazando el método GetHashCode
- 13. GetHashCode() con claves de cadena
- 14. Implementando IConvertible.GetTypeCode
- 15. Implementando ToArgb()
- 16. Implementando CollectionChanged
- 17. ¿Por qué no está eclipse implementando mi Dynamic Web Project correctamente?
- 18. Python: Implementando slicing en __getitem__
- 19. IEqualityComparer <double> con una tolerancia; cómo implementar GetHashCode?
- 20. ¿Cuándo hacemos GetHashCode() para un diccionario?
- 21. Creando el método GetHashCode en C#
- 22. Si nunca utilizo HashSet, ¿debería implementar GetHashCode?
- 23. NHibernate: Razones para anular Iguales y GetHashCode
- 24. Igual a GetHashCode al comparar objetos
- 25. Forma correcta de reemplazar Igual() y GetHashCode()
- 26. aplicar GetHashCode() para objetos que contienen colecciones
- 27. ¿Cómo se implementa GetHashCode() para Int32?
- 28. .Net GetHashCode Bit operación de cambio
- 29. Implementando cliente COMET
- 30. Codeigniter. Implementando oAuth
Considere cerrar como duplicado de http://stackoverflow.com/a/720282/93922 –
Antes de hacer esto, le recomiendo que lea y entienda mi artículo sobre él: http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –
Gracias, entiendo que esta puede ser una pregunta común y debería haber hecho un poco más de cacería. Gracias por su ayuda – Zivka