通过密钥查找.NET字典值的速度?

时间:2010-08-19 12:09:28

标签: .net dictionary performance lookup

我有一个10000产品/颜色/尺寸组合的字典,我用以下内容创建:

AllRecords = DB.ProductColourSizes _
             .ToDictionary(function(b) String.Format("{0}_{1}_{2}", _
             b.ProductCode, b.ColourCode, b.SizeCode))

所以示例键就像“13AI_GRS_M”

我必须每隔30分钟将我的数据库与公司的ERP同步,对于每个颜色/大小组合,我需要使用此字典来添加,编辑或删除记录。我希望他们提供身份证号码。

我不知道词典在内部如何运作。 .NET根据这样的密钥找到正确的值有多快?我应该对数据库查询进行排序,还是.NET有其他方法来识别密钥?

或者我应该将其转换为List并使用Dictionary来识别正确的索引?或者完全是另一种方式?

我也在整个网站的应用程序中使用静态字典,因此学习更好的方法会产生相当大的影响。

非常感谢,史蒂夫

5 个答案:

答案 0 :(得分:4)

对于你正在做的事情,字典是完美的。

词典中项目键的检索时间该死的,但最终依赖于键的哈希码功能(在您的情况下为string.GetHashCode())。

你很幸运,因为.Net字符串的GetHashCode()函数非常好。 如果你得到哈希码冲突,.Net将在对象上调用Equals方法,因此保证唯一性。

我们的词典中包含数十万个项目,查找时间可以忽略不计。

在这种情况下,从数据库中对结果集进行排序将没有任何好处。

希望这有帮助。

答案 1 :(得分:2)

  

.NET根据这样的密钥找到正确的值有多快?

检索密钥值的复杂性接近于O(1)according to MSDN,因此速度非常快......

同样来自MSDN:

  

检索速度取决于为TKey指定类型的哈希算法的质量。

如果你使用字符串作为键,你应该没问题,因为我们可以假设String类使用有效的散列算法......

答案 2 :(得分:1)

字典是为了查找事物,所以请坚持下去。 Key类型的主要问题是它应该有一个好的(分布良好的)哈希代码。

您可以使用ProductCode,ColourCode和SizeCode成员编写自己的KeyClass,但是您必须重载GetHashCode和Equals(及相关)成员。并且很难改进System.String的GethashCode,并且很容易出错。

所以,不要打扰。您的Key字符串看起来没问题。

如果您想进行优化,请首先查看您的问题所在。

答案 3 :(得分:1)

按键查找值非常快,使用字典似乎绝对合适。你创造的关键在我看来也没关系。预先排序数据库绝对没有意义,字典不依赖于此。

答案 4 :(得分:0)

我经常使用这个'模式',如果你不能让SQL查询(特别是在SQL CE上)运行得足够快。

您可能也希望查看ToLookup功能,因为在大多数情况下我觉得它更方便。查找速度不受影响,它使用映射到集合的字典。