C#Hashset包含非唯一对象

时间:2011-01-04 21:51:40

标签: c# hashset

使用此课程

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。

3 个答案:

答案 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;
}