此代码:
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
给我:
False
True
WTF?
答案 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
差异可能很微妙,但它是documented。 Char.CompareTo(Char)
中的比较是
基于 此实例的编码值 和价值,不是他们的词典 特性强>
同时,String.CompareTo(String)
执行一个单词(区分大小写和 文化敏感的比较使用 当前的文化。
即。第一个基于订单的比较,后者基于当前文化中的默认规则(您可能在字典中看到的顺序)。
答案 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