关于字符串比较的奇怪之处

时间:2010-11-06 13:43:37

标签: c# .net .net-3.5 .net-4.0

此代码:

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

给我:

False
True

WTF?

4 个答案:

答案 0 :(得分:8)

myChar.CompareTo(otherChar)仅根据其unicode值比较两个字符。

myString.CompareTo(otherString)使用当前文化的排序比较器,可以以更加词汇的方式实现。

答案 1 :(得分: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

差异可能很微妙,但它是documentedChar.CompareTo(Char)中的比较是

  

基于   此实例的编码值   和价值,不是他们的词典   特性

同时,String.CompareTo(String)

documentation
  

执行一个单词(区分大小写和   文化敏感的比较使用   当前的文化

即。第一个基于订单的比较,后者基于当前文化中的默认规则(您可能在字典中看到的顺序)。

答案 2 :(得分:2)

我认为myString.CompareTo(otherString)返回的值与CultureInfo.CurrentCulture.CompareInfo.Compare(myString,otherString,CompareOptions.None)相同,即依赖于文化的比较。

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

另一方面,

'char.CompareTo(otherChar)`只比较unicode值(即'a'为97而'〜'为126),因此会返回不同的结果。

答案 3 :(得分:1)

要以与字符相同的方式比较字符串(仅按字符代码的顺序),您必须使用序数比较:

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

输出:

True