StringComparison.Ordinal和InvariantCulture一样用于测试相等性吗?

Tim*_*ith 19 .net string culture equality string-comparison

从他们的简短摘要描述中,它听起来像字符串比较规则StringComparison.Ordinal,StringComparison.InvariantCulture并且意味着它们如何对字符串进行排序.这就是全部吗?也就是说,这是否意味着我们可以在进行相等比较时使用字符串比较规则?

string.Equals(a, b, StringComparison....)
Run Code Online (Sandbox Code Playgroud)

还有额外的功劳:如果我们进行比较OrdinalIgnoreCase,它会对答案产生影响InvariantCultureIgnoreCase吗?怎么样?

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

Ven*_*kov 22

例如,它确实很重要 - 有一种叫做角色扩展的东西

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

    s1.Equals(s2, StringComparison.Ordinal);          // false
    s1.Equals(s2, StringComparison.InvariantCulture); // true
Run Code Online (Sandbox Code Playgroud)

随着InvariantCultureß字符被扩大到ss.

  • 所以有趣的是,`String.Equals(s1, s2, StringComparison.OrdinalIgnoreCase)` 似乎是最好的不区分大小写的替代`(s1 == s2)`。 (2认同)

Han*_*ant 6

嗯,这当然很重要.当您使用"忽略大小写"相等比较时,您将在.NET框架中调用相当大量的代码,这些代码知道大小写规则在当前文化中的工作方式.对于像我这样的前邮票收藏家极客来说,其规则非常有趣,根据你的看法,有一些非常奇怪的规则.土耳其语I问题很有名,Unicode家伙必须为它们做出明确的例外.

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

但我离题了.按理说这StringComparison.OrdinalIgnoreCase比StringComparison.InvariantCultureIgnoreCase快一点.仅仅因为'不变'意味着美国,MSFT的故乡.难以测量,这是在纳秒时钟.StringComparison.CurrentCultureIgnoreCase命中那些转换表.第一次使用时会变慢,稍后再使用时会慢一些.