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
为什么结果不同?
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
-并注意该列表实际上不包括普通的连字符)