代码之家  ›  专栏  ›  技术社区  ›  Brandon Montgomery

为对象生成哈希代码

  •  0
  • Brandon Montgomery  · 技术社区  · 14 年前

    我有一个自定义对象( DataPointCollection )具有两个整数属性和一个guid属性。我希望该对象生成一个哈希代码,这样就不会将这些属性中具有相同值的两个对象添加到哈希集中。我知道我需要超越 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 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    您需要同时覆盖两者 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;
    }
    
        2
  •  1
  •   Community Mr_and_Mrs_D    7 年前

    如果我正确理解你,你只需要覆盖 GetHashCode Equals 你的方法 DataPointCollection 类,并在 this question 生成哈希代码。