Dictionary <string,t>(StringComparer)vs Dictionary <string,t>和存储key.ToUpper:你更喜欢哪一个?</string,t> </string,t>

时间:2010-04-22 08:52:54

标签: .net dictionary case-insensitive

免责声明:也许是微YAGNI优化,但听我说..

问题是要实现不区分大小写的查找表。

  • 我的老式方法:在填充字典时,在插入之前将密钥置于大写字母。当有人给你一个查找密钥时,大写密钥。
  • 新方式(我今天学到了它):Dictionary接受IComparer实现,所以我可以传入StringComparer.InvariantCultureIgnoreCase。我认为它会委托给String.Compare(x,y,SomeIgnoreCaseEnum)

新方法的优点在于我不需要确保在针对字典进行查找的n个位置中的每个位置执行.ToUpper()。

我的问题是哪一个更有效率?只是好奇我猜...

更新:注意我不需要知道插入的原始密钥。此外,使用的密钥与文化无关。

4 个答案:

答案 0 :(得分:3)

可能上层套管会更有效率,因为它可以进行序数比较......但我非常怀疑这对你来说是一个性能瓶颈。与以往一样,在您根据性能提交代码更改之前进行配置。

最终,指定字符串比较:

  • 意味着您不需要如何谨慎使用字典
  • 表示原始外壳保留在密钥中,在某些情况下可以帮助诊断
  • 明确说明您希望如何处理密钥。你最终只会在创作时说明一次 - 这会导致更清晰的代码IMO。

答案 1 :(得分:1)

检查entry。它今天仍然有效。

摘录:来自MSDN的“New Recommendations for Using Strings in Microsoft .NET 2.0

答案 2 :(得分:1)

我不知道性能,但我更喜欢StringComparer选项。使用ToUpper,您将丢失信息(原始大小写)。确实你可能不需要它,但是有一天你可能并且不再需要做任何工作(因此不受YAGNI原则的限制)。

我有一天也会忘记打电话给ToUpper并处于一个受伤的世界。但我的单元测试当然会救我。

答案 3 :(得分:0)

我已经接受了Oded的'Go profile!'评论:)这是一个明显的主要建议。

从我的考试(source code here

对于1M ContainsKey查找,

  • ToUpper方法:1123 msecs
  • 词典(OrdinalIgnoreCaseComparer) :971 msecs

我发现带有注入Comparer选项的Dictionary可以更好地减少麻烦。所以没有ToUpper()对我来说。