比较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。