假设我有一个名为 myclass 的类。
在我的代码中,我有两个 myclass 实例,myclass1 和 myclass2。它们的一切(公共和私有)属性都是相同的。
如果我尝试将它们都添加到 HashSet 中,它会同时添加还是只添加一个?如果它同时添加而我不想要它,我可以在 myclass 定义中覆盖 equals 并且 HasSet 会知道如何使用它吗?
假设我有一个名为 myclass 的类。
在我的代码中,我有两个 myclass 实例,myclass1 和 myclass2。它们的一切(公共和私有)属性都是相同的。
如果我尝试将它们都添加到 HashSet 中,它会同时添加还是只添加一个?如果它同时添加而我不想要它,我可以在 myclass 定义中覆盖 equals 并且 HasSet 会知道如何使用它吗?
简短的回答,这取决于您的对象的 Equals 方法。
更长的答案:
HashSet 将使用 IEqualityComparer 来确定两个对象是否相等。如果您不提供,它将使用EqualityComparer.Default
;它实际上只是使用 object.Equals(a, b) 加上一些东西来避免装箱值类型。
检查文档object.Equals(a, b)
:它实际上只是a.Equals(b)
在检查空值后执行。
的默认实现object.Equals(other)
是仅检查引用相等性(即,它们是对象的完全相同的实例),但您可以覆盖它以执行您喜欢的任何检查,例如检查 ID 字段是否相同。请注意,在覆盖 Equals 时,您还必须覆盖 GetHashCode。
如果要更改 HashSet 确定相等性的方式而不更改对象的定义,则可以为其提供自定义 IEqualityComparer。