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。

相關文章
相關標籤/搜索