0

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

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

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

4

1 回答 1

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。

于 2009-08-21T22:13:35.833 回答