我是C#的新手,我在字符串比较中发现了一些我不太懂的东西。
有人可以解释一下为什么字符之间的比较会产生与下面代码中一个字符长度字符串的比较相反的结果吗?
我希望"9" < "="
为true
(因为&#39; 9&#39;(57)的unicode代码小于&#39; =&#39;的unicode代码( 61))但这是假的......
后面的字符串的比较逻辑是什么?为什么它与比较字符有什么不同?
代码:
bool resChComp = '9' < '=';
bool resStrComp = String.Compare("9", "=") < 0;
Console.WriteLine($"\n'9' < '=' : {resChComp}, \"9\" < \"=\" : { resStrComp }");
输出:
'9' < '=' : True, "9" < "=" : False
答案 0 :(得分:5)
默认字符串比较是进行'单词排序'。 From the documentation,
.NET Framework使用三种不同的排序方式:单词排序,字符串排序和顺序排序。单词排序执行文化敏感的字符串比较。某些非字母数字字符可能会分配特殊权重。例如,连字符(“ - ”)可能具有非常小的权重,因此“coop”和“co-op”在排序列表中彼此相邻。字符串排序类似于单词排序,除了没有特殊情况。因此,所有非字母数字符号都在所有字母数字字符之前。序数排序根据字符串中每个元素的Unicode值比较字符串。
您期望的比较是序数比较,您可以使用StringComparison.Ordinal
重载中的String.Compare
来获得,比如:
bool resStrComp = String.Compare("9", "=", StringComparison.Ordinal) < 0;
这将使用unicode值比较字符串,就像比较一个字符与另一个字符一样。
答案 1 :(得分:2)
这是因为String.Compare默认使用单词排序顺序,而不是字符的数字值。恰好是对于所使用的文化,9
在排序顺序中位于=
之前。
如果指定了序号(二进制)排序规则,提到here,它将按预期工作。
bool resStrComp = String.Compare("9", "=", StringComparison.Ordinal) < 0;
答案 2 :(得分:0)
在字符比较的情况下,字符将转换为与ASCII值对应的int
。 9
的ASCII值为57,=
的值为61.这意味着字符串比较和字符比较并不是完全相同的事情(这就是为什么它们可能会有不同的结果)