2011-01-12 75 views
19

从他们的简要总结描述中,听起来像字符串比较规则StringComparison.OrdinalStringComparison.InvariantCulture意味着它们在如何对字符串进行排序排序时有所不同。那全部是?即,这是否意味着我们可以在进行平等比较时使用字符串比较规则?是StringComparison.Ordinal,它与InvariantCulture相同,用于测试相等性吗?

string.Equals(a, b, StringComparison....) 

而对于额外的分数:它使答案的差异,如果我们比较OrdinalIgnoreCaseInvariantCultureIgnoreCase?怎么样?

请提供支持论据和/或参考。

+2

由于某些语言具有奇怪的大写/小写规则,所以文化对于大小写不变的比较很重要。例如土耳其语,它是两个较低的和两个大写的“我”,它们是交叉匹配的。 – CodesInChaos 2011-01-12 22:15:26

回答

19

的确很重要,例如 - 有一种东西叫做字符扩展

var s1 = "Strasse"; 
    var s2 = "Straße"; 

    s1.Equals(s2, StringComparison.Ordinal);   // false 
    s1.Equals(s2, StringComparison.InvariantCulture); // true 

随着InvariantCultureß字符被扩大到ss

+0

是的,但问题是关于InvariantCulture,而不是CurrentCulture。 – 2013-11-20 16:33:41

5

嗯,它当然很重要。当你使用“忽略大小写”相等比较的时候,你在.NET框架中调用了相当庞大的代码块,它意识到框架规则在当前文化中是如何工作的。其中的规则对像我这样的前邮票收藏家怪胎非常有趣,根据你的看法,有一些非常奇怪的规则。土耳其我的问题很出名,Unicode帅哥必须为他们制定一个明确的例外。

它实际上不是代码btw,它是查找表。因为它需要MSFT维护C#编译器的/ linkres命令行选项,这本身就有趣。您不能在自己的项目中使用的编译选项。这完全是为了让mscorlib能够找到.nlp文件,即文化规则的转换表。存储在GAC的与mscorlib.dll相同的子目录中,这是编译选项的作用。

但我离题了。它的理由是StringComparison.OrdinalIgnoreCase比StringComparison.InvariantCultureIgnoresCase稍微快一点。仅仅因为'不变'意味着美国,MSFT的故乡。很难衡量,这个时钟在几纳秒。 StringComparison.CurrentCultureIgnoreCase命中这些翻译表。第一次使用时速度很慢,稍后使用时速度会变慢。

+1

+1有趣! – 2013-11-20 16:36:05

4

对于额外的信用问题