2013-07-22 36 views
2

好的,所以我需要一點幫助。我有一個通用字典「cashdata」。這個字典的關鍵是對象(查詢對象,我定義的一個類)。查詢對象具有「條款」字段(字符串列表)和「操作員」字段,它是一個枚舉(「全部」或「任意」)。C#:使用ContainsKey其中的鍵是對象

cashdata.ContainsKey(a_query_object); 

而且有它取決於如果a_query_object並在字典的對象是自己的條款和操作方面都是完全相同的產生真或假。做這個的最好方式是什麼?一個HashCode可能?我會很感激的一個例子,在此先感謝。

編輯:cashdata字典的定義是這樣的

Dictionary<Query,List<string> > cashData = new Dictionary<Query,List<string>>(); 
+0

請顯示更多代碼,或者您如何定義此泛型詞典。 – MethodMan

+5

在您的自定義對象上覆蓋'Equals'和'GetHashCode',將斷點放入並遍歷代碼 - 這將幫助您瞭解'ContainsKey'以及字典的其他方法如何工作。 –

+0

確保Query對象的術語和運算符在添加到Dictionary後不能更改。如果發生這種情況,您將無法在字典中正確找到對象。 – hatchet

回答

1

讓你的對象實施IEquatable Interface與在備註部分MSDN中提到的首要Object.EqualsGetHashCode沿

如果實現IEquatable,你還應該覆蓋Object.Equals(Object)和GetHashCode的基類 的類實現,以使其 的行爲與IEquatable.Equals的行爲一致方法。如果您重寫Object.Equals(Object),則在調用類的靜態方法 Equals(System.Object,System.Object)時,也會調用您的重寫的 實現。在 另外,您應該重載op_Equality和op_Inequality 運算符。這確保了所有相等的測試返回一致的 結果。

+0

請注意'IEquatable'。 [繼承和IEquatable不混合](http://blog.mischel.com/2013/01/05/inheritance-and-iequatable-do-not-mix/) –

+0

@JimMischel我不知道我做的是什麼不同於你的代碼,但我嘗試了與你有相同的代碼(簡單的複製和粘貼)的第一次測試,並且我在兩種情況下都返回了4次錯誤(帶和不帶符號) – MEYWD

相關問題