You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中CompareTo()与Compare()方法是否可返回-1和1以外的整数?

C#字符串比较常见问题解答

问题1:CompareTo()和Compare()方法返回的「相对」整数是否包含-1和1以外的数值?

是的,完全可以返回-1、1之外的整数。这些方法的核心规则是:

  • 返回负数:表示当前字符串/对象排在被比较对象之前
  • 返回0:表示两者相等
  • 返回正数:表示当前字符串/对象排在被比较对象之后

官方从未限定返回值只能是-1、0、1,很多技术文章只是简化了说明。实际实现中,默认的序数比较会返回第一个不同字符的Unicode码点差值——比如你测试的"Aloha!"和"Hello!",第一个不同字符是'A'(Unicode码点65)和'H'(72),差值为65-72=-7,所以返回-7,这是完全符合规范的。

问题2:在C#中,排序顺序里大写字母与小写字母哪个优先级更高?

默认的字符串比较(不指定文化或比较规则时)基于Unicode码点:

  • 大写字母A-Z的Unicode码点范围是65-90
  • 小写字母a-z的Unicode码点范围是97-122

因为大写字母的码点更小,所以默认排序中大写字母优先级更高,会排在小写字母前面。比如执行String.Compare("A", "a")会返回负数,说明"A"排在"a"之前。

如果需要忽略大小写或使用特定文化的排序规则,可以通过String.Compare的重载参数指定(比如StringComparison.OrdinalIgnoreCase)。

问题3:C#中字母是否有固定整数值,可用于计算或核对CompareTo()/Compare()的返回结果?

是的,每个字符都对应固定的Unicode码点整数值,你可以通过强制类型转换获取:

int codeA = (int)'A'; // 结果是65
int codeH = (int)'H'; // 结果是72

在默认的序数比较逻辑下,字符串比较会逐个对比字符的码点:

  1. 找到第一个不同的字符,返回两者的码点差值
  2. 如果所有字符都相同,则返回两个字符串的长度差值(正数表示当前字符串更长,负数更短)

所以你完全可以用这个规则来核对Compare()/CompareTo()的返回结果——比如你测试的例子中,"Aloha!"和"Hello!"的第一个不同字符差值就是65-72=-7,和返回结果一致。


测试示例代码

Console.WriteLine(String.Compare("Aloha!", "Hello!"));
Console.WriteLine(String.Compare("Hello!", "Aloha!"));
Console.WriteLine(String.Compare("Hello!", "Hello!"));

控制台输出

-7
7
0

内容的提问来源于stack exchange,提问作者Olufekifeki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:42:43