我想知道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
为什么结果不同?
答案 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 强>
不要将普通连字符与软连字符混淆!
\u002D
。 \u00AD
。注意the documentation for string.Compare()
,其示例代码显示忽略了 soft 连字符。文档说明:
字符集包括可忽略的字符。该 比较(String,String,Boolean)方法不考虑这样 执行文化敏感比较时的字符。
soft 连字符是可忽略字符之一,但重要的是要注意软连字符与普通连字符不同。因此,本文档不适用于您的示例代码。
上面给出了正常连字符表现不同的实际原因。
(如果您想要Unicode中所有可忽略字符的完整列表,请转到http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt并搜索Default_Ignorable_Code_Point
- 并注意此列表实际上不包含正常连字符。)