C#compareto方法如何比较字符串

时间:2016-09-08 07:34:58

标签: c# compareto

我想知道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

为什么结果不同?

1 个答案:

答案 0 :(得分:5)

TLDR :默认的词典字符串排序专门处理-个字符。

答案是默认字符串比较使用词典排序规则。

这意味着某些符号(例如-)会被特别处理。

The documentation for CompareOptions州:

  

.NET Framework使用三种不同的排序方式:单词排序,   字符串排序和序数排序。单词排序执行文化敏感   字符串的比较。某些非字母数字字符可能有   分配给他们的特殊权重。例如,连字符(“ - ”)可能   分配给它的重量非常小,以便“合作”和“合作”   在排序列表中彼此相邻。字符串排序类似于   单词排序,除了没有特殊情况。所以,一切   非字母数字符号位于所有字母数字字符之前。   序数排序根据每个字符串的Unicode值比较字符串   字符串的元素。

在您的情况下,正在使用默认排序:Word排序。

您可以通过在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

<强> ASIDE

不要将普通连字符与软连字符混淆!

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

注意the documentation for string.Compare(),其示例代码显示忽略了 soft 连字符。文档说明:

  

字符集包括可忽略的字符。该   比较(String,String,Boolean)方法不考虑这样   执行文化敏感比较时的字符。

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

上面给出了正常连字符表现不同的实际原因。

(如果您想要Unicode中所有可忽略字符的完整列表,请转到http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt并搜索Default_Ignorable_Code_Point - 并注意此列表实际上不包含正常连字符。)