0

我有一个DataPointCollection带有两个 Integer 属性和一个 Guid 属性的自定义对象 ( )。我希望该对象生成一个 HashCode,以便不会将这些属性中具有相同值的两个对象添加到 HashSet。我知道我需要重写该GetHashCode()方法,但是如何生成哈希码来完成此操作?

这就是我想要使用它的方式。

Dim dataPointCollections As New HashSet(Of DataPointCollection)()

For Each row As DataRow In myDataSet.Tables(0).Rows

  Dim dataPointCollection As New DataPointCollection()
  dataPointCollection.ProjectID = row("ProjectID") 'Integer'
  dataPointCollection.RoleID = row("RoleID") 'Integer'
  dataPointCollection.ResourceGUID = row("ResourceGUID") 'Guid'

  If Not dataPointCollections.Contains(dataPointCollection) Then
    dataPointCollections.Add(dataPointCollection)
  End If

Next

我对其他想法持开放态度,但我认为这可能比对对象集合执行 LINQ 查询更快(这些对象可能非常多)。

4

2 回答 2

4

您需要同时覆盖两者GetHashCode-Equals这是两者的组合,将由HashSet.

您的平等检查应该:

  • 检查另一个对象是否与该对象的类型相同(如果DataPointCollection是密封类型则更简单;相等和继承在组合时很混乱)
  • 比较三个字段是否相等

你的哈希码检查需要结合这三个字段;结果不必是唯一的;为了性能,如果两个不相等的对象具有不同的哈希码会更好,但这不是必需的。绝对要求是两个相等的对象确实具有相同的哈希码。我会做这样的事情(C#,但很容易转换为 VB):

public override int GetHashCode()
{
    int hash = 17;
    hash = hash * 31 + projectId;
    hash = hash * 31 + roleId;
    hash = hash * 31 + resourceGuid.GetHashCode();
    return hash;
}
于 2010-11-16T15:39:19.643 回答
1

如果我理解正确,您只需要覆盖类中的GetHashCodeandEquals方法DataPointCollection,并使用此问题中的方法生成哈希码。

于 2010-11-16T15:38:01.440 回答