2010-11-06 332 views
3

奇怪的這段代碼:關於字符串比較

 Console.WriteLine("~".CompareTo("a") > 0); 
     Console.WriteLine('~'.CompareTo('a') > 0); 

給我:

False 
True 

跆拳道?

回答

4

另一種方式來展現這種行爲是:

Console.WriteLine("a".CompareTo("b")); // -1 
Console.WriteLine("b".CompareTo("a")); // 1 
Console.WriteLine('a'.CompareTo('b')); // -1 
Console.WriteLine('b'.CompareTo('a')); // 1 

Console.WriteLine("~".CompareTo("a")); // -1 
Console.WriteLine("a".CompareTo("~")); // 1 
Console.WriteLine('~'.CompareTo('a')); // 29 
Console.WriteLine('a'.CompareTo('~')); // -29 

區別可能是微妙的,但它是documented。在Char.CompareTo(Char)比較是

基於 此實例 和值的編碼的值,不是他們辭書 特性

與此同時,該documentationString.CompareTo(String)

執行字(區分大小寫和 文化敏感)使用 當前區域性比較

I.e.第一個基於比較順序,後者是當前文化中的默認規則(您可能在字典中看到的順序)。

8

myChar.CompareTo(otherChar)僅通過它們的unicode值比較兩個字符。

myString.CompareTo(otherString)使用當前文化的排序比較器,可以用更加詞彙的方式實現。

2

我認爲myString.CompareTo(otherString)返回與CultureInfo.CurrentCulture.CompareInfo.Compare(myString,otherString,CompareOptions.None)相同的值,即做一個與文化相關的比較。

在大多數文化中,非字母字符排序之前字母,因此'~''a'之前。

另一方面,'char.CompareTo(otherChar)'只比較unicode的值(即'a'爲97,'〜'爲126),因此返回不同的結果。

1

比較字符串的方式相同的字符(由唯一的字符代碼的順序),你必須使用一個序號比較:

Console.WriteLine(String.Compare("~", "a", StringComparison.Ordinal) > 0); 

輸出:

True