使用此课程
public class Foo
{
public string c1, c2;
public Foo(string one, string two)
{
c1 = one;
c2 = two;
}
public override int GetHashCode()
{
return (c1 + c2).GetHashCode();
}
}
这个HashSet
HashSet<Foo> aFoos = new HashSet<Foo>();
Foo aFoo = new Foo("a", "b");
aFoos.Add(aFoo);
aFoos.Add(new Foo("a", "b"));
label1.Text = aFoos.Count().ToString();
我得到了答案2,肯定它应该是1.有没有办法解决这个问题,所以我的HashSet只包含唯一的对象?
谢谢,Ash。
答案 0 :(得分:26)
HashSet<T>
类型ultamitely使用相等来确定2个对象是否相等。在Foo
类型中,您只覆盖了GetHashCode
而不是相等。这意味着相等性检查将默认返回到使用引用相等性的Object.Equals
。这解释了为什么您在HashSet<Foo>
中看到多个项目。
要解决此问题,您需要覆盖Equals
类型中的Foo
。
public override bool Equals(object obj) {
var other = obj as Foo;
if (other == null) {
return false;
}
return c1 == other.c1 && c2 == other.c2;
}
答案 1 :(得分:7)
您需要覆盖Equals
方法。只有GetHashCode
是不够的。
答案 2 :(得分:4)
您还需要覆盖equals方法。这样做的原因是允许哈希码与两个不相等的对象发生冲突。否则它将无法工作。
public override bool Equals(Object obj)
{
Foo otherObject = obj as Foo;
return otherObject != null && otherObject.c1 == this.c1 && otherObject.c2 == this.c2;
}