21

如果我想要一个不区分大小写的字符串键字典,那么在给定这些约束的情况下,我应该使用哪个版本的 StringComparer:

  • 字典中的键来自仅以英语语言环境(美国或英国)编写的 C# 代码或配置文件
  • 该软件是国际化的,将在不同的语言环境中运行

我通常使用 StringComparer.InvariantCultureIgnoreCase 但不确定这是否正确。这是示例代码:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);
4

7 回答 7

32

比较器分为三种:

  • 文化意识
  • 文化不变
  • 序数

每个比较器都有区分大小写不区分大小写的版本。

序数比较器使用字符的序数值。这是最快的比较器,它应该用于内部目的。

文化感知比较器考虑特定于当前线程文化的方面。它知道“土耳其语 i”、“西班牙语 LL”等问题。它应该用于 UI 字符串。

文化不变比较器实际上没有定义,并且会产生不可预测的结果,因此根本不应该使用。

参考

  1. 在 Microsoft .NET 2.0 中使用字符串的新建议
于 2008-10-09T20:28:39.670 回答
12

这篇 MSDN 文章涵盖了您可能想深入了解的所有内容,包括土耳其语-I 问题。

已经有一段时间没有读了,所以我要再读一次。一个小时后见!

于 2008-10-09T20:33:29.207 回答
3

“不区分大小写”的概念是一种语言概念,因此没有文化就没有意义。

有关更多信息,请参阅此博客

也就是说,如果您只是在谈论使用拉丁字母的字符串,那么您可能会摆脱 InvariantCulture。

不过,最好使用 StringComparer.CurrentCulture 创建字典。例如,这将允许“ß”在您的字典中匹配德国文化下的“ss”。

于 2008-10-09T17:18:52.643 回答
1

由于键是您已知的固定值,因此 InvariantCultureIgnoreCase 或 OrdinalIgnoreCase 应该可以工作。避免特定于文化的问题,否则您可能会遇到一些更“有趣”的事情,例如“土耳其语 i”问题。显然,如果您要比较文化价值,您会使用文化比较器……但听起来您不是。

于 2008-10-09T17:16:07.220 回答
1

StringComparer.OrdinalIgnoreCase 比 InvariantCultureIgnoreCase FWIW 稍快(根据MSDN ,“序数比较很快,但对文化不敏感” 。

当然,您必须进行大量比较才能注意到差异。

于 2008-10-09T17:20:49.410 回答
0

Invariant Culture 专门用于处理程序内部的字符串,与用户数据或 UI 无关。听起来这种情况就是这种情况。

于 2008-10-09T17:27:58.163 回答
0

System.Collections.Specialized 包括 StringDictionary。MSDN 的备注部分指出“键不能为空,但值可以。

密钥以不区分大小写的方式处理;它在与字符串字典一起使用之前被翻译为小写。

在 .NET Framework 1.0 版中,此类使用区分区域性的字符串比较。但是,在 .NET Framework 1.1 版及更高版本中,此类在比较字符串时使用 CultureInfo.InvariantCulture。有关区域性如何影响比较和排序的详细信息,请参阅比较和排序特定区域性的数据和执行不区分区域性的字符串操作。

于 2008-10-14T04:08:42.253 回答