4

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

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

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

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

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

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

4

4 回答 4

3

大写可能会更有效,因为它可以进行序数比较......但我非常怀疑这对你来说是一个性能瓶颈。与以往一样,在您根据性能提交代码更改之前进行概要分析。

最终,指定字符串比较:

  • 意味着你不需要那么小心你如何使用字典
  • 意味着原始外壳保留在钥匙中,在某些情况下有助于诊断
  • 明确说明您希望如何处理密钥。您最终只在创建时声明一次 - 这会导致更清晰的代码 IMO。
于 2010-04-22T08:57:11.867 回答
1

检查这个条目。今天仍然有效。

摘录:来自 MSDN 的“在 Microsoft .NET 2.0 中使用字符串的新建议

于 2010-04-22T08:56:48.963 回答
1

我不知道性能,但我更喜欢 StringComparer 选项。使用 ToUpper,您会丢失信息(原始大小写)。诚然,您可能不需要它,但有一天您可能需要它,而且感觉不需要再做任何工作来保留它(因此不受 YAGNI 原则的影响)。

有一天,我也会忘记给 ToUpper 打电话,而陷入一个受伤的世界。但是我的单元测试当然会救我。

于 2010-04-22T08:58:14.507 回答
0

我会接受 Oded 的“Go profile!” 评论 :) 这是一个显而易见的建议。

从我的测试(源代码在这里

对于 1M ContainsKey 查找,

  • ToUpper 方法:1123 毫秒
  • 字典(OrdinalIgnoreCaseComparer):971 毫秒

我发现 Dictionary 带有注入的 Comparer 选项可以更好地执行且更少麻烦。所以对我来说不再有 ToUpper() 了。

于 2010-04-22T11:23:34.770 回答