【问题标题】:Hashsets and different instances of class with all members identical哈希集和所有成员相同的类的不同实例
【发布时间】:2010-11-21 19:32:35
【问题描述】:
假设我有一个名为 myclass 的类。
在我的代码中,我有两个 myclass 实例,myclass1 和 myclass2。
它们的一切(公共和私有)属性都是相同的。
如果我尝试将它们都添加到 HashSet 中,它会同时添加还是仅添加一个?
如果它同时添加而我不想要它,我可以在 myclass 定义中覆盖 equals 并且 HasSet 会知道如何使用它吗?
【问题讨论】:
标签:
.net
equals
equality
hashset
iequalitycomparer
【解决方案1】:
简短的回答,这取决于您对象的 Equals 方法。
更长的答案:
HashSet 将使用 IEqualityComparer 来确定两个对象是否相等。如果您不提供,它将使用EqualityComparer.Default;它实际上只是使用 object.Equals(a, b) 加上一些东西来避免装箱值类型。
检查object.Equals(a, b) 的文档:它实际上只是在检查空值后执行a.Equals(b)。
object.Equals(other) 的默认实现是仅检查引用相等性(即,它们是对象的完全相同的实例),但您可以覆盖它以执行您喜欢的任何检查,例如检查 ID 字段是否为完全相同的。请注意,在覆盖 Equals 时,您还必须覆盖 GetHashCode。
如果您想在不改变对象定义的情况下更改 HashSet 确定相等性的方式,您可以为其提供自定义 IEqualityComparer。