不变文化与序数字符串比较的区别

当比较c#中的两个字符串是否相等时,InvariantCulture和Ordinal比较有什么区别?


InvariantCulture的

使用“标准”字符排序集(a,b,c,...等)。 这与一些特定的区域设置形成对比,这些区域设置可以按不同的顺序对字符进行排序('a-with-acute'可以在'a'之前之后,具体取决于语言环境等等)。

序数词

另一方面,纯粹看代表字符的原始字节的值。


http://msdn.microsoft.com/en-us/library/e6883c06.aspx上有一个很棒的示例,它显示了各种StringComparison值的结果。 最后,它显示(摘录):

StringComparison.InvariantCulture:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)

StringComparison.Ordinal:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)

您可以看到InvariantCulture产出(U + 0069,U + 0049,U + 00131),Ordinal产量(U + 0049,U + 0069,U + 00131)。


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

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

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

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

InvariantCulture将ß字符扩展为ss。


指出在.NET Framework中使用字符串的最佳实践:

  • 使用StringComparison.OrdinalStringComparison.OrdinalIgnoreCase进行比较,作为文化无关字符串匹配的安全默认值。
  • 使用与StringComparison.OrdinalStringComparison.OrdinalIgnoreCase进行比较以获得更好的性能。
  • 当比较语言不相关时(例如符号),使用非语言学StringComparison.OrdinalStringComparison.OrdinalIgnoreCase值而不是基于CultureInfo.InvariantCulture的字符串操作。
  • 最后:

  • 在大多数情况下,不要使用基于StringComparison.InvariantCulture字符串操作 。 少数例外之一是,当你坚持语言有意义但文化不可知的数据时。
  • 链接地址: http://www.djcxy.com/p/21187.html

    上一篇: Difference between InvariantCulture and Ordinal string comparison

    下一篇: Difference in months between two dates