覆盖一个类型的Equals和GetHashCode,它有'dibs'?
这个问题和Jon的回答让我意识到这甚至存在,所以我很好奇并启动了Visual Studio。
我按照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));
}
}
所以我有几个问题:
如果Equals方法在处理我的自定义相等性方面做得很好,为什么我也必须重写GetHashCode方法呢?
比较下面的内容,使用哪个比较器,Equals或GetHashCode?
。
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();
}
操作员方法究竟做了什么?它看起来像某种伏都教黑魔法。
没有找到相关结果
已邀请:
4 个回复
缝皋
中的键,或存储在
中。 比较下面的内容,使用哪个比较器,Equals或GetHashCode? GetHashCode不用于比较 - 仅用于散列操作。始终使用等于。 操作员方法究竟做了什么?它看起来像某种伏都教黑魔法。 这允许您直接在两个类型的实例上使用
。如果没有这个,您将通过引用比较您的类型是否为类,而不是类型中的值。
桑娠贯涤
悲帽慑彤电
决定平等。
返回适合哈希映射的哈希码,但不保证相等。因此,在平等问题上,
将是决定平等的方法。
适用于散列集,例如
。在字典中查找项目时,您将匹配哈希码上的条目,然后匹配
。
赐黄