2017-07-25 11 views
5

我有兩個相同長度的字符串。
我假設(可能錯誤地)在每個字符串的每個字符之間插入一個空格不會改變它們的順序。在兩個字符串的字符之間插入空格修改它們的順序

var e1 = "12*4"; 
var e2 = "12-4"; 
Console.WriteLine(String.Compare(e1,e2)); // -1 (e1 < e2) 

var f1 = "1 2 * 4"; 
var f2 = "1 2 - 4"; 
Console.WriteLine(String.Compare(f1,f2)); // +1 (f1 > f2) 

如果我插入其他字符(例如_x),順序將被保留。

發生了什麼事?

在此先感謝。

+1

我不相信你所以我測試過。這很奇怪。 – Paparazzi

+0

看來只有最後一個空間正在打破它。 – Paparazzi

+1

使用'StringComparison.Ordinal'時都會產生'-3'。 - ('Invariant'也顯示這個奇怪的'-1/1'行爲) – Corak

回答

4

如果使用序數比較,您將得到正確的結果。

原因是序數比較是通過評估字符串對象中每個字符的數字值來實現的,所以插入空格將沒有區別。

如果您使用其他類型的比較,還涉及其他事項。從文檔:

使用單詞排序規則的操作執行文化敏感 比較,其中某些非字母數字Unicode字符可能 分配有特殊的權重。使用字詞排序規則和特定文化的約定,連字符(「 - 」)可能會分配一個很小的權重,以便在排序中彼此相鄰的「coop」和「co-op」出現在 之間名單。

使用序號排序規則的操作將根據 字符串中每個Char的數值(Unicode代碼點)執行比較。序數比較很快但對文化不敏感。當使用序號排序規則排序以Unicode 字符(U +)開頭的字符串時,字符串U + xxxx位於字符串U + yyyy之前,如果 xxxx的值在數字上小於yyyy。

2

從MSDN:

比較使用當前培養以得到區域性特定信息,諸如套管規則和單個字符的字母順序。例如,文化可以指定某些字符組合被視爲單個字符,或者以特定方式比較大寫和小寫字符,或者字符的排序順序取決於前後的字符。

比較字符串時,應該調用Compare(String,String,StringComparison)方法,該方法要求您顯式指定該方法使用的字符串比較的類型。

它表明存在一些文化問題,這意味着最後一個空間會改變兩者的排序順序。

相關問題