【问题标题】:Alternative to Dictionary for Int32 keyed collections?替代 Int32 键控集合的字典?
【发布时间】:2011-07-29 07:59:49
【问题描述】:

Int32 的哈希值是 Int32 的值 via:
Hashtables (Dictionary etc) with integer keys

因此,使用Dictionary(Of Integer, someObject)(或任何散列集合,就此而言)会增加什么价值?

当然,我需要使用.Contains(integerKey) 来防止错误...但我可以完全跳过散列算法,对吧?

您会使用什么类型来优化插入/检索?

编辑:我希望我可以按 10^5 次查找和 10^3 次插入的顺序执行,这些操作肯定不是我的流程的瓶颈。

【问题讨论】:

    标签: .net collections dictionary integer key


    【解决方案1】:

    除非数字形成范围 0...x(在这种情况下,您可以只使用 List<T> 甚至只是一个数组)我仍然会选择 Dictionary<int, Whatever> 方法。它很简单,很有效,而且几乎可以肯定它的运行速度对您来说足够快。

    这听起来确实像是微优化,在您证明自己遇到问题之前应该跳过它。与其他操作相比,您多久会在字典中查找项目?

    编辑:正如 Timwi 所说,如果这真的对性能至关重要,这里确实可以节省潜在成本。如果没有通用键类型和虚拟方法调用来获取哈希码和比较值,您当然可以做得更好。但我不会像内置的那样信任任何第三方集合,而且我当然不会信任我自己的集合实现来处理任何不重要的事情,而无需进行大量测试。 .. 在我考虑放弃内置类型之前,它必须成为整个应用程序中非常重要的瓶颈。

    【讨论】:

    • 感谢您的意见。我有种微优化的感觉...你知道 Dictionary 是否会短路散列 Int32 值,还是会继续进行散列(并返回相同的值)?
    • @Matthew:它调用 Int32.GetHashCode,它只返回 int - 这非常快。
    • @Timwi:自从我添加评论以来,如果我们暂时假设它是性能关键代码,您已经添加了。我不认为我们应该假设...部分原因是开发人员经常在没有证据的情况下假设它,而且我认为最好在有证据时才开始构建自己的收藏 i> 这样做是值得的。
    • @Reed:这并不完全正确。它调用IEqualityComparer<int>.GetHashCode(int),在默认相等比较器的情况下调用IEquatable<int>.GetHashCode(),后者又返回整数。在获取整数之前,有两个级别的接口方法解析...
    • @Reed:刚刚尝试使用自定义IEqualityComparer<T> - 它实际上比默认设置慢一点。不知道为什么。
    【解决方案2】:

    字典只会在类型上调用GetHashCode,所以对于 Int32,我想这会很快。基本上,我认为它已经为您优化得足够了。

    我使用什么类型取决于值的键的类型,在大多数情况下我倾向于不担心性能。

    【讨论】:

    • 好点。我想 Int32 类型的 GetHashCode 只是返回值。
    • @MatthewPK Reflector 确认:return this
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2014-12-24
    • 2019-09-04
    • 2018-02-28
    • 2021-09-12
    • 2015-12-13
    相关资源
    最近更新 更多