2010-11-16 86 views
0

我有一個自定義對象(DataPointCollection),它具有兩個整型屬性和一個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

您需要覆蓋GetHashCodeEquals - 這兩個組合將被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; 
} 
1

如果我理解正確的話,你只需要重寫你的DataPointCollectionGetHashCodeEquals方法,用該方法在this question生成散列碼。