使用哪个版本的StringComparer

时间:2008-10-09 17:10:30

标签: c# .net string internationalization

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

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

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

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

7 个答案:

答案 0 :(得分:31)

有三种比较器:

  • 文化感知
  • 文化不变

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

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

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

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

参考

  1. New Recommendations for Using Strings in Microsoft .NET 2.0

答案 1 :(得分:12)

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

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

答案 2 :(得分:3)

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

有关详细信息,请参阅此blog

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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