c#如何比较字符串

本文关键字:比较 字符串 何比较 | 更新日期: 2023-09-27 18:06:05

我想知道c#的CompareTo方法如何比较两个字符串,所以我这样测试:

string str1 = "0";
string str2 = "-";
Console.WriteLine(str1.CompareTo(str2)); // output : 1
string str3 = "01";
string str4 = "-1";
Console.WriteLine(str3.CompareTo(str4)); // output : -1

为什么结果不同?

c#如何比较字符串

TLDR:默认的字典顺序字符串顺序对-字符进行特殊处理。

这个问题的答案是默认的字符串比较使用字典排序规则。

这意味着某些符号——例如,-,被特殊处理。

CompareOptions的文档说明:

.NET框架使用三种不同的排序方式:字排序,字符串排序和序数排序。单词排序执行文化敏感的操作字符串比较。某些非字母数字字符可能具有赋予它们特殊的权重。例如,连字符("-")可能给它一个很小的权重,这样"coop"answers"co-op"在排序列表中彼此相邻出现。字符串排序类似于单词排序,除了没有特殊情况。因此,所有非字母数字符号出现在所有字母数字字符之前。序数排序基于每个字符串的Unicode值来比较字符串

在您的示例中,使用的是默认排序:Word sort。

您可以通过在string.Compare()中指定您想要的比较类型来查看不同的结果:

string str3 = "01";
string str4 = "-1";
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.InvariantCulture))); // output : -1
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.Ordinal)));          // output : 1

在这里,您可以看到它在不进行序数比较时特别处理-

这真的是-被特殊对待-它没有假设它是一个负号。例如,如果您使用+而不是-,您将得到:

string str1 = "0";
string str2 = "+";
Console.WriteLine(Math.Sign(string.Compare(str1, str2, StringComparison.InvariantCulture))); // output : 1
Console.WriteLine(Math.Sign(string.Compare(str1, str2, StringComparison.Ordinal)));          // output : 1
string str3 = "01";
string str4 = "+1";
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.InvariantCulture))); // output : 1
Console.WriteLine(Math.Sign(string.Compare(str3, str4, StringComparison.Ordinal)));          // output : 1

除了

不要混淆普通连字符和软连字符!

  • 普通连字符的Unicode值为'u002D
  • 软连字符Unicode值为'u00AD

请注意string.Compare()的文档,其中有示例代码,显示忽略连字符。文档说明:

字符集包括可忽略的字符。的Compare(String, String, Boolean)方法不考虑这些

连字符是可忽略的字符之一,但重要的是要注意软连字符与普通连字符不同。因此,本文档不适用于您的示例代码。

正常的连字符表现不同的实际原因如上所述。

(如果您想要Unicode中所有可忽略字符的完整列表,请访问http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt并搜索Default_Ignorable_Code_Point -并注意该列表实际上不包括普通的连字符)