对于一小组键/值对(默认值为2,最大值为5),Dictionary<TKey, TValue>
似乎有点矫枉过正。是否有一个更简单的数据结构可以在我的情况下使用?我正在为某些对象缓存计算值(即<MyClass, double>
),因此检索速度很重要。
由于
答案 0 :(得分:8)
List<KeyValuePair<TKey, TValue>>
(使用适当的容量创建)在这种情况下可能也会起作用......但它不会非常惯用。 (为了清楚起见,你只需在每个关键元素上调用Equals
,完全忽略哈希码。)如果List<T>
对你感觉有点沉重,你甚至可以去{{1如果你想要的话。 Ick,但是嘿......这是你的代码。
你真的试过KeyValuePair<TKey, TValue>[]
并发现它太慢了吗? “看起来像矫枉过正”似乎并不像“我已经尝试过它,描述它,并且发现我的应用程序的时间花费在创建词典并在其中查找条目而花费了不可接受的数量。我需要我的应用程序有性能特征X,目前我只有Y.“
如果您的密钥类型具有特定的排序(并且如果您要对数据结构执行比创建实例更多的查找),则可以对列表进行排序,这意味着对于任何列表都将进行最多3次比较特别查找。只有5个条目,你甚至可以硬编码所有潜在的路径,如果你想要优化到剑柄。 (你甚至可能对2,3,4和5个元素有不同的实现。虽然在这一点上有点傻。)这基本上是Dictionary<TKey, TValue>
实现,但你可能是能够针对只有少量条目的情况稍微优化一下。同样,首先尝试内置类型是值得的。
至关重要的是,您知道代码的这一部分对您的整体表现有多重要 - 以及它何时“足够好”以便您可以适当地停止。
答案 1 :(得分:1)
如果在编译时知道了这组键,那么你可以简单地创建一个具有可保存值的可空属性的类(或结构)。
答案 2 :(得分:0)
如果使用类似KeyValuePair<TKey, TValue>[]
的数组,则可以对其进行排序,然后使用二进制搜索进行搜索。但是,如果您必须排序一次然后检索多次,这种情况就会很快。
答案 3 :(得分:-2)
我经常喜欢使用Hashtable类(http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx)。
您可以做的另一件事是,不用担心自己管理任何缓存而只是使用ASP.NET中的缓存。您所要做的就是包含system.web程序集,然后即使在非Web应用程序中也可以使用它。这是一篇关于在Windows窗体应用程序中使用.Net缓存代码的文章。这很简单。
http://www.codeproject.com/KB/cs/cacheinwinformapps.aspx
d