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

is StringComparison.Ordinal the same as InvariantCulture for testing equality?

从简短的摘要描述来看,似乎字符串比较规则StringComparison.OrdinalStringComparison.InvariantCulture在如何对字符串进行排序方面有所不同。就这些吗?也就是说,这是否意味着在进行相等比较时可以使用字符串比较规则?

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

另外,如果我们比较OrdinalIgnoreCaseInvariantCultureIgnoreCase,答案会有什么不同吗?怎么用?

请提供支持性论点和/或参考文献。


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

1
2
3
4
5
    var s1 ="Strasse";
    var s2 ="Stra?e";

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

使用InvariantCulture时,?字符扩展到ss字符。


嗯,这当然很重要。当您使用"忽略大小写"相等比较时,您将在.NET框架中调用相当大的代码块,这些代码了解大小写规则在当前文化中的工作方式。这些规则对像我这样的前集邮爱好者来说非常有趣,根据你的长相,有一些非常奇怪的规则。土耳其语的i问题很有名,Unicode的家伙们不得不明确地为他们破例。

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

但我离题了。很明显,StringComparison.OrdinalIgnoreCase比StringComparison.InvariantCultureIgnoreCase快一点。因为"不变式"意味着美国,MSFT的故乡。很难测量,这种时钟以纳秒计。StringComparison.CurrentCultureignoreCase会命中这些转换表。当你第一次使用它的时候会非常慢,当你以后使用它们的时候会变慢。


对于额外的信用问题

  • 比较混乱:不变与序数

    …添加了序数排序的概念,并将序数成员添加到CompareOptions枚举中。选择它将忽略所有这些文化排序功能,并为您提供一个二进制排序,顺便说一下,也不会改变。

  • 字符串比较不变式文化特征词与序数逻辑词?

  • C:字符串比较准则和常用用法

    建议指出,对于文化不可知论比较,使用序数和序数病例比较。它们既快又安全。它们依赖于字节匹配,是匹配内部(非UI)处理字符串的最佳选项。