2011-01-12 75 views
19

從他們的簡要總結描述中,聽起來像字符串比較規則StringComparison.OrdinalStringComparison.InvariantCulture意味着它們在如何對字符串進行排序排序時有所不同。那全部是?即,這是否意味着我們可以在進行平等比較時使用字符串比較規則?是StringComparison.Ordinal,它與InvariantCulture相同,用於測試相等性嗎?

string.Equals(a, b, StringComparison....) 

而對於額外的分數:它使答案的差異,如果我們比較OrdinalIgnoreCaseInvariantCultureIgnoreCase?怎麼樣?

請提供支持論據和/或參考。

+2

由於某些語言具有奇怪的大寫/小寫規則,所以文化對於大小寫不變的比較很重要。例如土耳其語,它是兩個較低的和兩個大寫的「我」,它們是交叉匹配的。 – CodesInChaos 2011-01-12 22:15:26

回答

19

的確很重要,例如 - 有一種東西叫做字符擴展

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

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

隨着InvariantCultureß字符被擴大到ss

+0

是的,但問題是關於InvariantCulture,而不是CurrentCulture。 – 2013-11-20 16:33:41

5

嗯,它當然很重要。當你使用「忽略大小寫」相等比較的時候,你在.NET框架中調用了相當龐大的代碼塊,它意識到框架規則在當前文化中是如何工作的。其中的規則對像我這樣的前郵票收藏家怪胎非常有趣,根據你的看法,有一些非常奇怪的規則。土耳其我的問題很出名,Unicode帥哥必須爲他們制定一個明確的例外。

它實際上不是代碼btw,它是查找表。因爲它需要MSFT維護C#編譯器的/ linkres命令行選項,這本身就有趣。您不能在自己的項目中使用的編譯選項。這完全是爲了讓mscorlib能夠找到.nlp文件,即文化規則的轉換表。存儲在GAC的與mscorlib.dll相同的子目錄中,這是編譯選項的作用。

但我離題了。它的理由是StringComparison.OrdinalIgnoreCase比StringComparison.InvariantCultureIgnoresCase稍微快一點。僅僅因爲'不變'意味着美國,MSFT的故鄉。很難衡量,這個時鐘在幾納秒。 StringComparison.CurrentCultureIgnoreCase命中這些翻譯表。第一次使用時速度很慢,稍後使用時速度會變慢。

+1

+1有趣! – 2013-11-20 16:36:05

4

對於額外的信用問題