GetHashCode等于C#中类的实现

hIp*_*pPy 0 c# equals gethashcode

我有一个类Person,我必须覆盖它的Equals和GetHashCode方法.如果名称匹配,则两个人对象等于电子邮件匹配.使用相当高效的哈希函数,这样做的好方法是什么?

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

你不能,真的.好吧,除了返回一个恒定值之外.

以这种方式看待它...所有拥有电子邮件"x"的人都必须拥有相同的哈希码,因为它们是相同的.所有名称为"y"的人都必须具有相同的哈希码,因此它继续:

Name    Email    Hash
  n1       e1      h1
  n2       e1      h1 (because emails are equal
  n2       e2      h1 (because names are equal to previous)
Run Code Online (Sandbox Code Playgroud)

请注意我们如何设法将名称电子邮件更改为任意值,但哈希仍然是h1.


sna*_*arf 8

我知道这不能解答您的问题,但您的方法不正确.预计如果a == b,并且b == c,则必然遵循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
Run Code Online (Sandbox Code Playgroud)

在这个例子中a == b,而b == c,但是a = = c.这是不正确的行为.如果你想实现这种行为,那么有一个方法可以完成另一个Equals来进行这种比较,但不是等于.

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