Pregunta

I tiene una persona de clase para las que tengo para anular los Iguales y método GetHashCode. Dos objetos son iguales persona si el nombre coincide o si los partidos de correo electrónico. ¿Qué es una buena manera de hacer esto con una función hash considerablemente eficiente?

class Person
{
    string Name
    string Email

    public override Equals(object obj)
    {
        if (ReferenceEquals(obj, null))
            return false;
        if (ReferenceEquals(this, obj))
            return true;
        if (obj is Person)
        {
            Person person = (Person)obj;
            return
                (this.Name == person.Name)
                || (this.Email == person.Email);
        }
        return false;
    }

    public override GetHashCode()
    {
        // What's a good way to implement?
    }
}
¿Fue útil?

Solución

No se puede, en realidad. Bueno, no aparte de devolver un valor constante.

a ver de esta manera ... todas las personas con correo electrónico "x" tiene que tener el mismo código hash, porque son iguales. Y todas las personas con nombre "y" tiene que tener el mismo código hash, y así sigue:

Name    Email    Hash
  n1       e1      h1
  n2       e1      h1 (because emails are equal
  n2       e2      h1 (because names are equal to previous)

Nota cómo hemos logrado cambiar tanto el nombre de y el correo electrónico para valores arbitrarios, pero el hash tiene que seguir siendo h1.

Otros consejos

Yo sé que esto no responde a su pregunta, pero su enfoque es incorrecto. Se espera que si a == b, y b == c, se deduce necesariamente que a == c.

Person a:
    name: mike
    email: someone@website.com

Person b:
    name: steve
    email: someone@website.com

Person c:
    name: steve
    email: steve@website.com

En este ejemplo a == b, y b == c, pero a! = C. Se trata de un comportamiento incorrecto. Si desea implementar este comportamiento, es perfectamente posible tener un método distinto que sea igual que hace esta comparación, pero no es igual.

http://msdn.microsoft.com /en-us/library/ms173147%28VS.80%29.aspx .

Al igual que Alex dijo, esto es más de una cosa relacionada con las reglas de negocio y yo no usaría Iguales para este propósito. Tendría otro método que tiene la aplicación que tiene en el método equals.

Por supuesto, Alex menciona un hash del nombre + correo electrónico, pero que no va a funcionar para usted, ya sea desde Jon señaló, en realidad no es algo que puede hacer teniendo en cuenta las reglas de negocio que tiene.

Hay una manera en la que puede hacer lo que estamos tratando de hacer.

ejemplo de le permiten tener una enumeración que ha definido como tal

public enum MatchedOn { None, Name, Email }

A continuación, tire de la aplicación de su método Equals en otro procedimiento de este tipo que se llame desde su método Equals. En este nuevo método, establezca la enumeración que ser Nombre si los nombres son iguales o correo electrónico si los mensajes de correo electrónico son iguales o Ninguno si no es el mismo.

A continuación, en su aplicación GetHashCode puede llamar a este nuevo método, así y luego devolver un código hash basado en Nombre o Email o la combinación de ambos.

Espero que tenga sentido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top