我有一个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来识别正确的索引?或者完全是另一种方式?
我也在整个网站的应用程序中使用静态字典,因此学习更好的方法会产生相当大的影响。
非常感谢,史蒂夫
答案 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功能,因为在大多数情况下我觉得它更方便。查找速度不受影响,它使用映射到集合的字典。