回答
的字典键可以是可变的,但改变它,而它存储在字典可能是一个非常糟糕的主意。如果密钥的哈希值发生变化,则根据密钥的新哈希值,字典条目可能位于错误的存储桶中。这意味着你将无法再找到它。从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