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.
我知道这不能解答您的问题,但您的方法不正确.预计如果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.