1. 程式人生 > >String.Compare(String, String, StringComparison)方法

String.Compare(String, String, StringComparison)方法

這是C#中用來比較兩個字串的較好方法,原因如下:

1. 可以選擇是否忽略單詞大小寫,相比於將單詞全轉換為大寫(toUpperCase())或小寫(toLowerCase())後再比較,String.Compare的效率更高。

2. 可以設定是否採用文化敏感(culture-sensitive)的排序規則,其中,(StringComparsion.)CurrentCulture和InvariantCulture是文化敏感的;Ordinal是非文化敏感的,該模式下會比較字元的原始位元組碼的值。為什麼會有上述關於文化敏感的選擇呢?微軟的官方文件(https://msdn.microsoft.com/en-us/library/ms973919.aspx)裡介紹了下述的“The Turkish-I”問題:

For nearly all Latin alphabets, including U.S. English, the character i (\u0069) is the lowercase version of the character I (\u0049). This casing rule quickly becomes the default for someone programming in such a culture. However, in Turkish ("tr-TR"), there exists a capital "i with a dot," character 

(\u0130), which is the capital version of i. Similarly, in Turkish, there is a lowercase "i without a dot," or  (\u0131), which capitalizes to I. This behavior occurs in the Azeri culture ("az") as well.

大意是,幾乎所有的拉丁字母表,包括美國英語,字元i (\u0069) 是字元I (\u0049) 的小寫版本,這個大小寫規則也是身處這樣的文化中的程式設計師採用的預設規則。但是,在土耳其語裡("tr-TR"),存在大寫的“有個點的i”,即

 (\u0130),它是i的大寫版本;類似,土耳其語裡也存在小寫的“沒有點的i”,即 (\u0131),它大寫就是I。這一現象在Azeri文化("az")中也存在。

另外也可以參考下面這個例子(http://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparison):

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

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

        s1.Equals(s2, StringComparison.InvariantCulture);  //true
這個現象叫字元擴充(character expansion),在InvariantCulture模式下, ß會被擴充為ss。

所以呢,一般比較字串似乎採用String.Compare(s1, s2, StringComparison.CurrentCulture),或再加上IgnoreCase。