我有一个使用string.compare(string,string)的应用程序来排序某些值。我无法弄清楚的是为什么“1022”比小于“10-23”和“10-23”的比较小于“1024”。
“ - ”的值是否会导致此结果?对于相同类型的数据(带破折号的数字),string.compare的重载是否会为不同的文化设置提供相同的结果?
答案 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)