奇怪的這段代碼:關於字符串比較
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
給我:
False
True
跆拳道?
奇怪的這段代碼:關於字符串比較
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
給我:
False
True
跆拳道?
另一種方式來展現這種行爲是:
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)
比較是
基於 此實例 和值的編碼的值,不是他們辭書 特性。
與此同時,該documentation爲String.CompareTo(String)
執行字(區分大小寫和 文化敏感)使用 當前區域性比較。
I.e.第一個基於比較順序,後者是當前文化中的默認規則(您可能在字典中看到的順序)。
myChar.CompareTo(otherChar)
僅通過它們的unicode值比較兩個字符。
myString.CompareTo(otherString)
使用當前文化的排序比較器,可以用更加詞彙的方式實現。
我認爲myString.CompareTo(otherString)
返回與CultureInfo.CurrentCulture.CompareInfo.Compare(myString,otherString,CompareOptions.None)
相同的值,即做一個與文化相關的比較。
在大多數文化中,非字母字符排序之前字母,因此'~'
來'a'
之前。
另一方面,'char.CompareTo(otherChar)'只比較unicode的值(即'a'爲97,'〜'爲126),因此返回不同的結果。
比較字符串的方式相同的字符(由唯一的字符代碼的順序),你必須使用一個序號比較:
Console.WriteLine(String.Compare("~", "a", StringComparison.Ordinal) > 0);
輸出:
True