关于字符串比较
问题描述:
奇怪的这段代码:关于字符串比较
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