这些比较应该返回什么?

时间:2008-11-05 06:45:25

标签: c# .net string comparison

我有一个使用string.compare(string,string)的应用程序来排序某些值。我无法弄清楚的是为什么“1022”比小于“10-23”和“10-23”的比较小于“1024”。

“ - ”的值是否会导致此结果?对于相同类型的数据(带破折号的数字),string.compare的重载是否会为不同的文化设置提供相同的结果?

2 个答案:

答案 0 :(得分:5)

来自string.Compare(String, String)的文档:

  

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

further

  

.NET Framework使用三种不同的排序方式:单词排序,字符串排序和顺序排序。单词排序执行文化敏感的字符串比较。某些非字母数字字符可能会分配特殊权重。例如,连字符(“ - ”)可能具有非常小的权重,因此“coop”和“co-op”在排序列表中彼此相邻。字符串排序类似于单词排序,除了没有特殊情况。因此,所有非字母数字符号都在所有字母数字字符之前。序数排序根据字符串中每个元素的Unicode值比较字符串。

Michael Kaplan的更多细节:A&P of Sort Keys, part 9 (aka Not always transitive, but punctual and punctuating)

答案 1 :(得分:3)

嗯,忽略破折号是相当无辜的。如果要包含它们,可能在重载中使用StringComparison.Ordinal

阅读docs for string.Compare,它使用单词排序规则,here表示:

  

单词排序执行文化敏感   字符串的比较。某些   非字母数字字符可能有   分配给他们的特殊权重。对于   连字符(“ - ”)可能有一个   分配给它的重量非常小   “coop”和“co-op”出现在旁边   彼此在排序列表中。

至少它是传递性的:我使用“连接”记录了一个bug,其中涉及一些非常相似的涉及破折号的东西 - 其中A< B,B< C C<答:因为非传递性比较基本上违反了排序规则。它被关闭“不会修复”。这是:

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)