我有一个自定义对象(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查询更快(可能有很多这些对象)。
答案 0 :(得分:4)
您需要覆盖GetHashCode
和Equals
- 这是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
类中的Equals
和DataPointCollection
方法,并使用this question中的方法生成哈希代码。