This question和乔恩的回答让我意识到这一点甚至存在,所以我开始好奇并启动了Visual。
我遵循了MSDN页面的一个示例,然后创建了我自己的小示例。其内容如下:
public class Person : IEquatable<Person>
{
public string IdNumber { get; set; }
public string Name { get; set; }
public bool Equals(Person otherPerson)
{
if (IdNumber == otherPerson.IdNumber)
return true;
else
return false;
}
public override bool Equals(object obj)
{
if (obj == null)
return base.Equals(obj);
if (!(obj is Person))
throw new InvalidCastException("The Object isn't of Type Person.");
else
return Equals(obj as Person);
}
public override int GetHashCode()
{
return IdNumber.GetHashCode();
}
public static bool operator ==(Person person1, Person person2)
{
return person1.Equals(person2);
}
public static bool operator !=(Person person1, Person person2)
{
return (!person1.Equals(person2));
}
}所以我有几个问题:
如果
。
static void Main(string[] args)
{
Person sergio = new Person() { IdNumber = "1", Name = "Sergio" };
Person lucille = new Person() { IdNumber = "2", Name = "Lucille" };
List<Person> people = new List<Person>(){
sergio,
lucille
};
Person lucille2 = new Person() { IdNumber = "2", Name = "Lucille" };
if (people.Contains(lucille2))
{
Console.WriteLine("Already exists.");
}
Console.ReadKey();
}发布于 2011-04-09 22:14:52
如果
方法在处理自定义等式方面做得很好,那么为什么还要重写GetHashCode方法呢?
这允许您的类型在通过散列方式工作的集合中使用,例如作为Dictionary<T, U>中的键,或者存储在HashSet<T>中。
在比较下面这样的东西时,使用的是哪个比较器,等于还是GetHashCode?
GetHashCode不用于比较--仅用于哈希操作。等价物总是被使用。
运算符方法到底是做什么的?看上去像是某种巫毒黑魔法在那里发生。
这允许您在两个类型的实例上直接使用==。没有这种情况,如果您的类型是类,那么您将根据引用进行比较,而不是根据类型内的值进行比较。
发布于 2011-04-09 22:15:10
GetHashCode的目的是为了平衡哈希表,而不是确定相等性。当查找哈希表的一个成员时,检查的哈希桶由哈希代码确定,然后由相等性决定对象是否在桶中。这就是为什么GetHashCode必须同意平等。
有关此主题的详细信息,请参阅我的文章:
http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/
发布于 2011-04-09 22:14:07
GetHashCode和Equals是两件非常不同的事情。Equals决定了平等。GetHashCode返回适合哈希映射的哈希代码,但不保证相等。因此,在平等问题上,Equals将是确定平等的方法。
GetHashCode用于哈希集,例如Dictionary。在字典中查找项时,您将匹配哈希代码上的条目,然后在Equals上匹配条目。
https://stackoverflow.com/questions/5608267
复制相似问题