gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:49:06 30 4
gpt4 key购买 nike

我想知道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:默认的字典字符串排序会特殊处理 - 字符。

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

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

The documentation for CompareOptions状态:

The .NET Framework uses three distinct ways of sorting: word sort, string sort, and ordinal sort. Word sort performs a culture-sensitive comparison of strings. Certain nonalphanumeric characters might have special weights assigned to them. For example, the hyphen ("-") might have a very small weight assigned to it so that "coop" and "co-op" appear next to each other in a sorted list. String sort is similar to word sort, except that there are no special cases. Therefore, all nonalphanumeric symbols come before all alphanumeric characters. Ordinal sort compares strings based on the Unicode values of each element of the string.

在您的例子中,使用的是默认排序:单词排序。

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

备注the documentation for string.Compare()其中包含显示 soft 连字符被忽略的示例代码。文档指出:

Character sets include ignorable characters. The Compare(String, String, Boolean) method does not consider such characters when it performs a culture-sensitive comparison.

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

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

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

关于c# - C# compareto 方法如何比较字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385080/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com