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 aFoos = new HashSet(); Foo aFoo = new Foo("a", "b"); aFoos.Add(aFoo); aFoos.Add(new Foo("a", "b")); label1.Text = aFoos.Count().ToString(); 

我得到答案2,肯定它应该是1.有没有办法解决这个问题,所以我的HashSet只包含唯一的对象?

谢谢,阿什。

HashSet类型ultamitely使用相等来确定2个对象是否相等。 在Foo类型中,您只重写了GetHashCode而不是相等。 这意味着相等性检查将默认返回到使用引用相等性的Object.Equals 。 这解释了为什么在HashSet看到多个项目。

要解决此问题,您需要在Foo类型中覆盖Equals

 public override bool Equals(object obj) { var other = obj as Foo; if (other == null) { return false; } return c1 == other.c1 && c2 == other.c2; } 

您需要重写Equals方法。 只有GetHashCode是不够的。

您还需要覆盖equals方法。 原因是允许哈希码与两个不相等的对象发生冲突。 否则它将无法工作。

 public override bool Equals(Object obj) { Foo otherObject = obj as Foo; return otherObject != null && otherObject.c1 == this.c1 && otherObject.c2 == this.c2; }