假设我有一个名为myclass的类。
在我的代码中,我有两个myclass实例,myclass1和myclass2。 关于他们的一切都是(公共和私人)属性是相同的。
如果我尝试将它们添加到HashSet中,它会添加两个还是只添加一个? 如果它添加了两者并且我不想要它,我可以在myclass定义中覆盖equals并且HasSet将知道如何使用它吗?
答案 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。