3

我有一个使用 string.compare(string,string) 对一些值进行排序的应用程序。我不明白为什么“1022”比较小于“10-23”而“10-23”比较小于“1024”。

是否有特定于“-”值的东西导致了这个结果?string.compare 的重载是否会为相同类型的数据(带有破折号的数字)在不同的文化设置下给出相同的结果?

4

2 回答 2

5

string.Compare(String, String)的文档中:

使用单词排序规则进行比较。

进一步

.NET Framework 使用三种不同的排序方式:单词排序、字符串排序和序数排序。Word 排序对字符串执行区分区域性的比较。某些非字母数字字符可能具有分配给它们的特殊权重。例如,连字符(“-”)可能分配给它的权重非常小,因此“coop”和“co-op”在排序列表中彼此相邻出现。字符串排序类似于单词排序,只是没有特殊情况。因此,所有非字母数字符号都位于所有字母数字字符之前。序数排序根据字符串中每个元素的 Unicode 值比较字符串。

来自 Michael Kaplan 的更多详细信息:排序键的 A&P,第 9 部分(又名不总是可传递的,但准时和标点符号)

于 2008-11-05T07:15:50.937 回答
3

好吧,忽略破折号是相当无辜的。如果你想包含它们,也许StringComparison.Ordinal在重载中使用。

阅读文档string.Compare,它使用单词排序规则,这意味着

Word 排序对字符串执行区分区域性的比较。某些非字母数字字符可能具有分配给它们的特殊权重。例如,连字符(“-”)可能分配给它的权重非常小,因此“coop”和“co-op”在排序列表中彼此相邻出现。

至少它是可传递的:我用“连接”记录了一个关于破折号的非常相似的错误- 其中 A < B、B < CC < A。因为非传递比较本质上违反了排序规则。它被关闭“不会修复”。这里是:

string s1 = "-0.67:-0.33:0.33";
string s2 = "0.67:-0.33:0.33";
string s3 = "-0.67:0.33:-0.33"; 
Console.WriteLine(s1.CompareTo(s2));
Console.WriteLine(s2.CompareTo(s3));
Console.WriteLine(s1.CompareTo(s3));

(在我的机器上返回 1,1,-1)

于 2008-11-05T07:01:51.870 回答