如果我想要一个不区分大小写的字符串键,那么在给定这些约束的情况下,我应该使用哪个版本的StringComparer:
我通常使用StringComparer.InvariantCultureIgnoreCase但不确定这是否是正确的情况。以下是示例代码:
Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);
答案 0 :(得分:31)
有三种比较器:
每个比较器都有区分大小写以及不区分大小写的版本。
序数比较器使用字符的序数值。这是最快的比较器,它应该用于内部目的。
文化感知比较器会考虑特定于当前线程文化的方面。它知道“土耳其语i”,“西班牙语LL”等问题。它应该用于UI字符串。
文化不变比较器实际上没有定义,并且可能产生不可预测的结果,因此根本不应该使用。
参考
答案 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。有关文化如何影响比较和排序的更多信息,请参阅比较和排序特定文化的数据并执行不区分文化的字符串操作。