Hashsets和类的不同实例,所有成员都相同

时间:2009-08-21 22:06:16

标签: .net equals equality hashset iequalitycomparer

假设我有一个名为myclass的类。

在我的代码中,我有两个myclass实例,myclass1和myclass2。 关于他们的一切都是(公共和私人)属性是相同的。

如果我尝试将它们添加到HashSet中,它会添加两个还是只添加一个? 如果它添加了两者并且我不想要它,我可以在myclass定义中覆盖equals并且HasSet将知道如何使用它吗?

1 个答案:

答案 0 :(得分:2)

简短回答,这取决于你对象的Equals方法。

更长的答案:

HashSet将使用IEqualityComparer来确定两个对象是否相等。如果您不提供,将使用EqualityComparer.Default;它实际上只是使用object.Equals(a,b)加上一些东西来避免拳击值类型。

检查object.Equals(a, b)的文档:检查空值后,它实际上只是执行a.Equals(b)

object.Equals(other)的默认实现是仅检查引用相等性(即,它们是对象的完全相同的实例),但您可以覆盖它以执行您喜欢的任何检查,例如检查ID是否字段是相同的。注意,当覆盖Equals时,您还必须覆盖GetHashCode。

如果要更改HashSet如何确定相等性而不更改对象的定义,则可以为其提供自定义IEqualityComparer。