2012-08-06 68 views
2

我已覆蓋Equal(Object comparee)方法,但當我添加對象到我的HashSet我仍然得到雙打。我錯過了什麼? MyType類型包含兩個int字段(讓我們這樣說)。是HashSet錯誤的集合類型,也許?使HashSet <MyType>不同對象具有相同的值

我希望添加一些MyType這些東西,但是這樣集合只存儲唯一的唯一的唯一定義(使用Equals方法或任何其他方式)。

回答

3

當你重寫Equals()你應該總是重寫GetHashCode()。我通常會爲該方法返回某種主鍵(如果可用)。否則,您可以查看this thread瞭解實施它的想法。

理解這兩種方法之間的關係,關鍵是:

  • 如果兩個項目具有不同的散列碼,他們絕對不是 相等。
  • 如果兩個條目具有相同的哈希碼,則它們可能相等,因此請致電 Equals()以確定。
2

您還需要覆蓋GetHashCode();否則,你的對象會有不同的hashcode,因此會自動被認爲是不同的。從你的對象中獲得一些獨特的價值,並使用它,如果可用的話,或者只是生成你自己的。

而且不要懶惰,並且對所有人都使用相同的散列碼;這將打敗HashSet的目的。因此,對於有兩個int領域的例子

,你可以這樣做:

public override int GetHashCode() { 
    return field1^field2; 
} 
+0

「......不要懶惰,爲所有人使用相同的哈希碼......」哈哈哈,你看到一個人來了,是不是你。好吧,只是因爲你指出了這點,我會做更進一步的事情。但是,一個問題 - 提高功率的建議散列不會顯着影響計算嗎?相反,我正在爲此付出代價。 – 2012-08-06 20:39:55

+0

這不是冪指數,它是異或(異或),它很快。看到這裏:http://msdn.microsoft.com/en-us/library/zkacc7k1%28v=vs.110%29.aspx – wsanville 2012-08-06 20:48:27

+0

過去幾天我一直和MatLab坐在一起...我要我的恥辱。 :) – 2012-08-06 20:54:45

相關問題