我正在使用HashSet<T>
来存储一组对象。这些对象已经具有System.Guid
的唯一ID,因此我宁愿HashSet<>
只使用现有ID而不是试图弄清楚如何散列对象。如何覆盖散列中的内置并强制我的程序使用内置ID值作为哈希值?
另请说我知道Guid
中某个对象的HashSet<>
,是否有办法仅根据此HashSet<T>
从Guid
获取对象?或者我应该使用字典。
答案 0 :(得分:4)
HashSet<>
不是基于键/值对,并且不提供“按键”访问 - 它只是一组唯一值,使用哈希非常快速地检查包含。
要使用键/值对(稍后按Guid
提取),最简单的选项是Dictionary<Guid,SomeType>
。 Guid
上的现有哈希码应该没问题(虽然如果你需要(你不在这里),你可以提供IEqualityComparer<T>
用于散列。
答案 1 :(得分:3)
覆盖对象的GetHashCode()
方法。
当然,这里有一点点皱纹...... GUID大于int32s,.NET用于哈希码。
答案 2 :(得分:1)
为什么需要覆盖这个?似乎也许是一个不成熟的优化。
是的,只需使用字典。开发应用程序后,请进行性能调整阶段,以衡量所有代码的性能。如果且仅当如果此散列函数显示为您最大的消耗,您应该考虑更高性能的数据结构(如果有的话): - )
答案 3 :(得分:1)
尝试查看System.KeyedCollection。它允许您将关键字段的知识嵌入到集合实现中。