回答
的字典鍵可以是可變的,但改變它,而它存儲在字典可能是一個非常糟糕的主意。如果密鑰的哈希值發生變化,則根據密鑰的新哈希值,字典條目可能位於錯誤的存儲桶中。這意味着你將無法再找到它。從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. 基於滿足要求的Excel分類
- 6. 我的解決方案是否滿足互斥要求?
- 7. 我需要多大的鑰匙?
- 8. TeamCity - 未滿足要求(DotNetFramework4.0_x86)
- 9. pip - 要求已滿足?
- 10. 滿足這些要求
- 11. 一個用於滿足我的要求的java excel api?
- 12. 如何檢查密碼是否滿足設計驗證要求?
- 13. 是nServiceBus是否適合滿足此要求?
- 14. nginx的:不要求localnet的密碼+滿足任何原因403
- 15. 找不到滿足要求的任何下載twython-django
- 16. 如果滿足任何的多串要求SAS變量賦值
- 17. Pip無法找到滿足要求的任何下載Flask == 0.10.1
- 18. 我應該使用哪個地圖來滿足我的要求?
- 19. jQuery AJAX「緩存」參數是否滿足我的需求?
- 20. TeamCity未滿足的要求:MSBuildTools14.0_x86_Path存在
- 21. 找不到滿足要求的版本
- 22. Lodash,以滿足對象的要求
- 23. 是否有可能修改Facebook的內置形式滿足我的需要?
- 24. 庫進口需要「鍵盤」和「鑰匙」
- 25. 我需要檢查一行是否存在幾個條件滿足的範圍
- 26. JOSSO可以滿足這個要求嗎?
- 27. SQL - 只有包含滿足要求
- 28. Java - For Loop即時滿足要求
- 29. Python Pex:無法滿足所有要求
- 30. 未能滿足項目要求
也許你想具體說明你所指的是哪種類型的鍵控集合... Dictionary也許? –
Reddog
2010-12-16 22:52:09