Difference between InvariantCulture and Ordinal string comparison
当比较c#中的两个字符串是否相等时,InvariantCulture和Ordinal比较有什么区别?
InvariantCulture
Uses a "standard" set of character orderings (a,b,c, ... etc.). This is in contrast to some specific locales, which may sort characters in different orders ('a-with-acute' may be before or after 'a', depending on the locale, and so on).
Ordinal
On the other hand, looks purely at the values of the raw byte(s) that represent the character.
There's a great sample at http://msdn.microsoft.com/en-us/library/e6883c06.aspx that shows the results of the various StringComparison values. All the way at the end, it shows (excerpted):
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)
You can see that where InvariantCulture yields (U+0069, U+0049, U+00131), Ordinal yields (U+0049, U+0069, U+00131).
It does matter, for example - there is a thing called character expansion
var s1 = "Strasse";
var s2 = "Straße";
s1.Equals(s2, StringComparison.Ordinal); //false
s1.Equals(s2, StringComparison.InvariantCulture); //true
With InvariantCulture
the ß character gets expanded to ss.
Pointing to Best Practices for Using Strings in the .NET Framework:
StringComparison.Ordinal
or StringComparison.OrdinalIgnoreCase
for comparisons as your safe default for culture-agnostic string matching. StringComparison.Ordinal
or StringComparison.OrdinalIgnoreCase
for better performance. StringComparison.Ordinal
or StringComparison.OrdinalIgnoreCase
values instead of string operations based on CultureInfo.InvariantCulture
when the comparison is linguistically irrelevant (symbolic, for example). And finally:
StringComparison.InvariantCulture
in most cases . One of the few exceptions is when you are persisting linguistically meaningful but culturally agnostic data. 上一篇: Html.Partial与Html.RenderPartial&Html.Action与Html.RenderAction
下一篇: 不变文化与序数字符串比较的区别