我想知道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
为什么结果会不同呢?
您可以通过在 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
旁注
不要将普通连字符与软连字符混淆!
\u002D
。\u00AD
。请注意 具有示例代码的 string.Compare()
文档,其中显示了一个软连字符被忽略的样例。文档指出:
字符集包括可忽略的字符。当使用基于区域性的比较时,Compare(String, String, Boolean) 方法不会考虑这些字符。
软连字符是一种可忽略的字符,但重要的是要注意软连字符与普通连字符不同。因此,本文档不适用于您的示例代码。
上述解释了普通连字符行为不同的实际原因。
如果你想获取Unicode中所有可忽略字符的完整列表,请访问http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt并搜索Default_Ignorable_Code_Point
- 请注意,这个列表实际上不包括普通连字符。
CultureInfo.CurrentCulture.CompareInfo.Compare
,因此是文化设置决定排序顺序,但结果看起来非常奇怪。 - Dennis_E