比較c#中的兩個字符串是否相等,InvariantCulture和Ordinal比較之間有什麼區別? 安全
例如,它確實很重要 - 有一種叫作角色擴展的東西 性能
var s1 = "Strasse"; var s2 = "Straße"; s1.Equals(s2, StringComparison.Ordinal); //false s1.Equals(s2, StringComparison.InvariantCulture); //true
使用InvariantCulture
,ß角色擴展爲ss。 this
指向在.NET Framework中使用字符串的最佳實踐 : spa
StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
進行比較,做爲與文化無關的字符串匹配的安全默認值。 StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
比較可得到更好的性能。 StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
值而不是基於CultureInfo.InvariantCulture
的字符串操做。 最後: code
StringComparison.InvariantCulture
字符串操做 。 少數例外狀況之一是當你堅持語言上有意義但文化上不可知的數據時。 雖然問題是關於平等 ,但爲了快速視覺參考,這裏使用一些文化排序的一些字符串的順序說明了那裏的一些特質。 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-DE
, ja-JP
和en-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)); }
不變量是一種語言上適當的比較類型。
序數是二元類型的比較。 (快點)
見http://www.siao2.com/2004/12/29/344136.aspx get
下面是一個示例,其中使用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。