我已覆蓋Equal(Object comparee)
方法,但當我添加對象到我的HashSet我仍然得到雙打。我錯過了什麼? MyType
類型包含兩個int
字段(讓我們這樣說)。是HashSet
錯誤的集合類型,也許?使HashSet <MyType>不同對象具有相同的值
我希望添加一些MyType
這些東西,但是這樣集合只存儲唯一的唯一的唯一定義(使用Equals
方法或任何其他方式)。
我已覆蓋Equal(Object comparee)
方法,但當我添加對象到我的HashSet我仍然得到雙打。我錯過了什麼? MyType
類型包含兩個int
字段(讓我們這樣說)。是HashSet
錯誤的集合類型,也許?使HashSet <MyType>不同對象具有相同的值
我希望添加一些MyType
這些東西,但是這樣集合只存儲唯一的唯一的唯一定義(使用Equals
方法或任何其他方式)。
當你重寫Equals()
你應該總是重寫GetHashCode()
。我通常會爲該方法返回某種主鍵(如果可用)。否則,您可以查看this thread瞭解實施它的想法。
理解這兩種方法之間的關係,關鍵是:
Equals()
以確定。您還需要覆蓋GetHashCode()
;否則,你的對象會有不同的hashcode,因此會自動被認爲是不同的。從你的對象中獲得一些獨特的價值,並使用它,如果可用的話,或者只是生成你自己的。
而且不要懶惰,並且對所有人都使用相同的散列碼;這將打敗HashSet
的目的。因此,對於有兩個int
領域的例子
,你可以這樣做:
public override int GetHashCode() {
return field1^field2;
}
「......不要懶惰,爲所有人使用相同的哈希碼......」哈哈哈,你看到一個人來了,是不是你。好吧,只是因爲你指出了這點,我會做更進一步的事情。但是,一個問題 - 提高功率的建議散列不會顯着影響計算嗎?相反,我正在爲此付出代價。 – 2012-08-06 20:39:55
這不是冪指數,它是異或(異或),它很快。看到這裏:http://msdn.microsoft.com/en-us/library/zkacc7k1%28v=vs.110%29.aspx – wsanville 2012-08-06 20:48:27
過去幾天我一直和MatLab坐在一起...我要我的恥辱。 :) – 2012-08-06 20:54:45