使用哪个版本的StringComparer

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

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

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

Dictionary stuff = new Dictionary(StringComparer.InvariantCultureIgnoreCase); 

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

我读了它已经有一段时间了,所以我再次这样做了。 一小时见!

有三种比较器:

  • 文化感知
  • 文化不变
  • 序数词

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

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

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

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

参考

  1. 在Microsoft .NET 2.0中使用字符串的新建议

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

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

如果你只是在谈论使用拉丁字母表的字符串,那么你可能会使用InvariantCulture。

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

由于密钥是您已知的固定值,因此InvariantCultureIgnoreCase或OrdinalIgnoreCase应该可以工作。 避免使用特定文化的文章,或者你可以点击一些更“有趣”的东西,比如“土耳其语”问题。 显然,如果你要比较文化价值,你会使用一种文化比较器……但听起来你不是。

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

你必须做很多比较才能注意到当然的不同。

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

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

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

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