InvariantCulture和Ordinal字符串比较之间的区别

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


#1楼

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

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

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

使用InvariantCulture ,ß角色扩展为ss。 this


#2楼

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

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

最后: code

  • 在大多数状况下,不要使用基于StringComparison.InvariantCulture字符串操做 。 少数例外状况之一是当你坚持语言上有意义但文化上不可知的数据时。

#3楼

虽然问题是关于平等 ,但为了快速视觉参考,这里使用一些文化排序的一些字符串的顺序说明了那里的一些特质。 orm

Ordinal          0 9 A Ab a aB aa ab ss Ä Äb ß ä äb ぁ あ ァ ア 亜 A
IgnoreCase       0 9 a A aa ab Ab aB ss ä Ä äb Äb ß ぁ あ ァ ア 亜 A
--------------------------------------------------------------------
InvariantCulture 0 9 a A A ä Ä aa ab aB Ab äb Äb ss ß ァ ぁ ア あ 亜
IgnoreCase       0 9 A a A Ä ä aa Ab aB ab Äb äb ß ss ァ ぁ ア あ 亜
--------------------------------------------------------------------
da-DK            0 9 a A A ab aB Ab ss ß ä Ä äb Äb aa ァ ぁ ア あ 亜
IgnoreCase       0 9 A a A Ab aB ab ß ss Ä ä Äb äb aa ァ ぁ ア あ 亜
--------------------------------------------------------------------
de-DE            0 9 a A A ä Ä aa ab aB Ab äb Äb ß ss ァ ぁ ア あ 亜
IgnoreCase       0 9 A a A Ä ä aa Ab aB ab Äb äb ss ß ァ ぁ ア あ 亜
--------------------------------------------------------------------
en-US            0 9 a A A ä Ä aa ab aB Ab äb Äb ß ss ァ ぁ ア あ 亜
IgnoreCase       0 9 A a A Ä ä aa Ab aB ab Äb äb ss ß ァ ぁ ア あ 亜
--------------------------------------------------------------------
ja-JP            0 9 a A A ä Ä aa ab aB Ab äb Äb ß ss ァ ぁ ア あ 亜
IgnoreCase       0 9 A a A Ä ä aa Ab aB ab Äb äb ss ß ァ ぁ ア あ 亜

观察: 排序

  • de-DEja-JPen-US以相同的方式排序
  • Invariant只对ssß排序,与上述三种文化不一样
  • da-DK彻底不一样
  • IgnoreCase标志对全部采样文化都很重要

用于生成上表的代码: 字符串

var l = new List<string>
    { "0", "9", "A", "Ab", "a", "aB", "aa", "ab", "ss", "ß",
      "Ä", "Äb", "ä", "äb", "あ", "ぁ", "ア", "ァ", "A", "亜" };

foreach (var comparer in new[]
{
    StringComparer.Ordinal,
    StringComparer.OrdinalIgnoreCase,
    StringComparer.InvariantCulture,
    StringComparer.InvariantCultureIgnoreCase,
    StringComparer.Create(new CultureInfo("da-DK"), false),
    StringComparer.Create(new CultureInfo("da-DK"), true),
    StringComparer.Create(new CultureInfo("de-DE"), false),
    StringComparer.Create(new CultureInfo("de-DE"), true),
    StringComparer.Create(new CultureInfo("en-US"), false),
    StringComparer.Create(new CultureInfo("en-US"), true),
    StringComparer.Create(new CultureInfo("ja-JP"), false),
    StringComparer.Create(new CultureInfo("ja-JP"), true),
})
{
    l.Sort(comparer);
    Console.WriteLine(string.Join(" ", l));
}

#4楼

不变量是一种语言上适当的比较类型。
序数是二元类型的比较。 (快点)
http://www.siao2.com/2004/12/29/344136.aspx get


#5楼

下面是一个示例,其中使用InvariantCultureIgnoreCase和OrdinalIgnoreCase的字符串相等性比较不会给出相同的结果: string

string str = "\xC4"; //A with umlaut, Ä
string A = str.Normalize(NormalizationForm.FormC);
//Length is 1, this will contain the single A with umlaut character (Ä)
string B = str.Normalize(NormalizationForm.FormD);
//Length is 2, this will contain an uppercase A followed by an umlaut combining character
bool equals1 = A.Equals(B, StringComparison.OrdinalIgnoreCase);
bool equals2 = A.Equals(B, StringComparison.InvariantCultureIgnoreCase);

若是你运行它,equals1将为false,equals2将为true。

相关文章
相关标签/搜索