开启左侧

C#中string.Compare原理,如何比较大小

[复制链接]
绝地武士 发表于 2020-7-9 18:02:49 | 显示全部楼层 |阅读模式
  1. int n = string.Compare("a", "A");
  2. Console.WriteLine(n);
复制代码

我们可以看到n是等于-1的也就是a小于A,但是直观上感觉a应该是A大的,毕竟转换成16进制是0x61肯定比0x41大。
参数说明如下:
  1. //
  2.         // 摘要:
  3.         //     比较两个指定的 System.String 对象,并返回一个指示二者在排序顺序中的相对位置的整数。
  4.         //
  5.         // 参数:
  6.         //   strA:
  7.         //     要比较的第一个字符串。
  8.         //
  9.         //   strB:
  10.         //     要比较的第二个字符串。
  11.         //
  12.         // 返回结果:
  13.         //     一个 32 位带符号整数,指示两个比较数之间的词法关系。值Condition小于零strA 小于 strB。零strA 等于 strB。大于零strA 大于
复制代码

也就是说,如果前面的字符串小于后面字符串就是-1,相等就是0,大于就是1,那么这个比较基准是怎么比较的呢?

一直以为基于ASCII,但是后面想想应该是基于UNICODE的编码顺序,毕竟字符串范围不仅限于ASCII,但是这里却不是简单的UNICODE顺序,而且基于一套排序算法。
大家可以在此下载排序权重表(Sorting Weight Tables):
https://www.microsoft.com/en-us/download/details.aspx?id=10921
我是win10 2004,所以下载win10版本的,对应文件名为:Windows 10 Sorting Weight Table.txt
然后我们打开该txt找到我们的字符串“a”和“A”对应的十六进制编码,看看他们的权重:
微信截图_20200709180105.png
由此可以看到,虽然十六进制a比A大,但是a的权重却低于A,所以返回-1。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表