回答
的字典鍵可以是可變的,但改變它,而它存儲在字典可能是一個非常糟糕的主意。如果密鑰的哈希值發生變化,則根據密鑰的新哈希值,字典條目可能位於錯誤的存儲桶中。這意味着你將無法再找到它。從documentation of Dictionary:
只要一個對象被用作
Dictionary<TKey, TValue>
的關鍵,它必須在不影響其散列值任何方式更改。根據字典的相等比較器,Dictionary<TKey, TValue>
中的每個密鑰必須是唯一的。一個密鑰不能是null,但值可以是,如果值類型爲TValue是一個引用類型。
基本上,一個鍵可以是任何對象,不能爲空。出於安全原因,密鑰應該是不可變的。
但是,你可以有:
Dictionary<Car, Color>
但Car
不應該是可變的,你失去或改變它的點的標識(或哈希馬克狀態)。
我假設你正在使用類,而不是結構。結構的考慮因素不同。
答案是,「這取決於」。它取決於你的對象是否可以邏輯地稱爲「值類型」 - 表示邏輯數據類型的邏輯值的東西 - 或者不是。 (這有點令人困惑,因爲.NET文檔將結構體稱爲「值類型」,我在更一般的OO定義中使用該術語 - 有些類實際上是值類型。)
值類型包括像字符串,日期,點等。在我們的代碼中,我們有一個共同的值類型,它只是日期的月份和年份部分。值類型通常是不可變的。該值的標識基於其內容;如果它們具有相同的內容,則兩個不同的實例在邏輯上是「相同的」。您可以有兩個不同的字符串實例,但如果它們包含相同的字符序列,則它們是「相同」值。
另一方面,由於缺乏更好的術語,我將稱之爲「對象」:不代表邏輯值的事物。這些將是字符串構建器,文件流,陣列,客戶,訂單和產品等。這些不是具體的價值。該對象的身份是基於它的實例:兩個不同的實例不是「相同的」;他們不同,因爲他們是不同的實例。
因此,您的問題的答案取決於您的對象是否代表上述定義下的「值類型」或「對象」。
如果它們是「值類型」,那麼您的班級需要覆蓋Equals
和GetHashCode
。 Equals
應該返回true,如果兩個實例是相同的類型並且具有相同的內容。GetHashCode
應該返回值的內容的散列;如果兩個實例「相同」,則它們必須返回相同的哈希碼。
如果它們是「對象」,則從System.Object繼承的Equals
和GetHashCode
實現將使用引用相等性來確定兩個對象是否「相同」(並因此應該在對象中被視爲相同的鍵)字典),這是你想要的。所以只要你不從繼承的東西本身覆蓋Equals
和GetHashCode
,你不需要做任何特殊的事情來使用「對象」作爲關鍵。
- 1. 是否有滿足我的所有要求基於jQuery燈箱
- 2. 是否有滿足這些要求的垃圾收集算法?
- 3. 對於鏈接共享的縮略圖,是否有任何要求滿足?
- 4. 我的解決方案是否滿足互斥要求?
- 5. 我需要多大的鑰匙?
- 6. TeamCity - 未滿足要求(DotNetFramework4.0_x86)
- 7. 滿足這些要求
- 8. 如何檢查密碼是否滿足設計驗證要求?
- 9. 是nServiceBus是否適合滿足此要求?
- 10. 如果滿足任何的多串要求SAS變量賦值
- 11. 我應該使用哪個地圖來滿足我的要求?
- 12. TeamCity未滿足的要求:MSBuildTools14.0_x86_Path存在
- 13. 是否有可能修改Facebook的內置形式滿足我的需要?
- 14. 庫進口需要「鍵盤」和「鑰匙」
- 15. JOSSO可以滿足這個要求嗎?
- 16. 哪個CMS滿足以下要求?
- 17. 未能滿足項目要求
- 18. SQL - 只有包含滿足要求
- 19. Java - For Loop即時滿足要求
- 20. Linq Query需要滿足WECO規則
- 21. 實施Windows服務 - 我如何滿足這些要求?
- 22. Levenshtein算法:我如何滿足這種文本編輯要求?
- 23. CodeContracts:如何使用this()調用滿足Ctor的要求?
- 24. 我是否需要處置任務?
- 25. 要選擇哪個GTK + Widget來滿足這個需求?
- 26. 要滿足要求的接口或抽象類
- 27. 沒有我的解決方案滿足要求的互斥
- 28. 滿足以下要求的最佳Web Mapping API是什麼?
- 29. Teamcity未滿足要求:powershell_x86_Edition等於桌面
- 30. 編輯此腳本以滿足我的需要
也許你想具體說明你所指的是哪種類型的鍵控集合... Dictionary也許? –
Reddog
2010-12-16 22:52:09