2010-11-06 136 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