C# 关于字符串比较的奇怪事情
此代码:C# 关于字符串比较的奇怪事情,c#,.net,.net-3.5,.net-4.0,C#,.net,.net 3.5,.net 4.0,此代码: Console.WriteLine("~".CompareTo("a") > 0); Console.WriteLine('~'.CompareTo('a') > 0); 给我: False True WTF?myChar.CompareTo(otherChar)仅通过unicode值比较两个字符 myString.CompareTo(otherString)使用当前区域性的排序比较器,该比较器可以以更词汇化的方式实现。我认为myStri
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
给我:
False
True
WTF?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
显示这种行为的另一种方式是:
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
差别可能很微妙,但确实如此。Char.CompareTo(Char)
中的比较是
基于
此实例的编码值
和价值,不是他们的词典
特性
同时,forString.CompareTo(String)
执行一个字(区分大小写和
文化敏感)比较使用
当前文化
即,第一种方法基于顺序进行比较,第二种方法基于当前区域性中的默认规则(您可能在词典中看到的顺序)