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