【发布时间】:2011-05-06 00:39:15
【问题描述】:
这段代码:
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
给我:
False
True
WTF?
【问题讨论】:
这段代码:
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
给我:
False
True
WTF?
【问题讨论】:
myChar.CompareTo(otherChar) 仅通过它们的 unicode 值比较两个字符。
myString.CompareTo(otherString) 使用当前文化的排序比较器,它可以以更词汇的方式实现。
【讨论】:
显示这种行为的另一种方式是:
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)
执行一个单词(区分大小写和 文化敏感)比较使用 当前的文化。
即第一个基于顺序进行比较,后者基于当前文化中的默认规则(您可能在字典中看到的顺序)。
【讨论】:
我认为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
【讨论】: