生成对象的哈希代码

时间:2010-11-16 15:33:13

标签: .net hashcode gethashcode

我有一个自定义对象(DataPointCollection),它有两个Integer属性和一个Guid属性。我希望该对象生成HashCode,以便在HashSet中不会将这些属性中具有相同值的两个对象添加到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查询更快(可能有很多这些对象)。

2 个答案:

答案 0 :(得分:4)

您需要覆盖GetHashCodeEquals - 这是HashSet将使用的两者的组合。

您的平等检查应该:

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

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

public override int GetHashCode()
{
    int hash = 17;
    hash = hash * 31 + projectId;
    hash = hash * 31 + roleId;
    hash = hash * 31 + resourceGuid.GetHashCode();
    return hash;
}

答案 1 :(得分:1)

如果我理解正确,您只需要覆盖GetHashCode类中的EqualsDataPointCollection方法,并使用this question中的方法生成哈希代码。