2011-02-03 18 views
6

Tengo una clase que se ve así.C# usar un objeto de clase como clave en el diccionario

public class Point : IEquatable<Point> 
{ 
    public int _xValue {get;set;} 
    public double _yValue {get;set;} 

    public Point(int x, double y) 
    { 
     _xValue = x; 
     _yValue = y; 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as Point); 
    } 

    public bool Equals(Point obj) 
    { 
     return obj != null && obj._xValue == this._xValue && obj._yValue == this._yValue; 
    } 


} 

que tienen que implementar la función GetHashCode para que pueda utilizarlo como una clave de diccionario. Pero no tengo claro qué tiene que devolver la función GetHashCode en esta situación. ¿Alguien me puede ayudar?

+0

¿Podría ser esto lo que estás buscando? http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode –

+0

beautiful. gracias – Aks

+0

@astander: Cuando una pregunta ya ha sido hecha y respondida antes, márcala como una estafa. Tienes muchos representantes para eso. (¿O no tiene votos hoy?) –

Respuesta

4

Debería devolver un número entero, preferiblemente exclusivo para cada instancia separada del objeto. Un valor hash es básicamente un número único creado a partir de los contenidos de un objeto, utilizado para identificar de forma única ese objeto. La regla número uno es que si dos de esos puntos se evalúan como iguales entre sí, el valor hash debe ser el mismo para ambos.

Una descripción más detallada está disponible en MSDN

2

La función GetHashCode necesita volver am número entero que identificará de forma única una instancia del objeto de otro a fin de evitar colisiones cuando se utiliza como una clave en el diccionario .

Debe poder reproducir de manera confiable el código hash, intente y evite usar valores aleatorios o de fecha como semillas para el código hash.

0

En su caso, usted podría hacer algo como:

return x^y;

+1

y es del tipo double – leeny

1

Usted podría hacer _xValue^_yValue.GetHashCode()

1

Hay algunas de las reglas básicas para esto:

  • Bool: si es verdadero, devuelve 0; de lo contrario, devuelve 1
  • Byte, char, short o int: devolver el valor del tipo de
  • largo: return (int) (f^f (>>> 32))
  • Float: volver Convert.ToInt32 del valor del tipo
  • objeto: devuelve el valor generado llamando object.GetHashCode()
  • matriz: Iterar toda la matriz y el tratamiento de cada elemento individualmente

así que en tu caso tienes x = int y y = doble, si sigues estas reglas, encontrarás la solución.

return x^y.GetHashCode();

Siempre puede agregar sofisticados algoritmos matemáticos, pero tenga cuidado con las colisiones numéricas.

+0

convirtiendo a int violaría la unicidad (2.6 -> 3 y también 2.9, etc.). Creo que tiene más sentido hacer x^y.GetHashCode() – leeny

+0

¡Tienes razón, gracias! –

Cuestiones relacionadas