【发布时间】:2008-11-05 06:45:24
【问题描述】:
我有一个使用 string.compare(string,string) 对一些值进行排序的应用程序。我不明白为什么“1022”比较小于“10-23”而“10-23”比较小于“1024”。
是否有特定于“-”值的东西导致了这个结果? string.compare 的重载是否会针对相同类型的数据(带有破折号的数字)在不同的文化设置下给出相同的结果?
【问题讨论】:
标签: c# .net string comparison
我有一个使用 string.compare(string,string) 对一些值进行排序的应用程序。我不明白为什么“1022”比较小于“10-23”而“10-23”比较小于“1024”。
是否有特定于“-”值的东西导致了这个结果? string.compare 的重载是否会针对相同类型的数据(带有破折号的数字)在不同的文化设置下给出相同的结果?
【问题讨论】:
标签: c# .net string comparison
来自string.Compare(String, String)的文档:
使用单词排序规则进行比较。
和further:
.NET Framework 使用三种不同的排序方式:单词排序、字符串排序和序数排序。 Word 排序对字符串执行区分区域性的比较。某些非字母数字字符可能具有分配给它们的特殊权重。例如,连字符(“-”)可能分配给它的权重非常小,因此“coop”和“co-op”在排序列表中彼此相邻出现。字符串排序类似于单词排序,只是没有特殊情况。因此,所有非字母数字符号都位于所有字母数字字符之前。序数排序根据字符串中每个元素的 Unicode 值比较字符串。
迈克尔·卡普兰的更多细节在这里:A&P of Sort Keys, part 9 (aka Not always transitive, but punctual and punctuating) 。
【讨论】:
好吧,忽略破折号是很无辜的。如果你想包含它们,也许在重载中使用StringComparison.Ordinal。
阅读docs for string.Compare,它使用单词排序规则,来自here的意思是:
字排序执行文化敏感 字符串比较。肯定 非字母数字字符可能有 分配给他们的特殊权重。为了 例如,连字符(“-”)可能有一个 分配给它的权重非常小,所以 “合作社”和“合作社”出现在旁边 彼此在一个排序列表中。
至少它是传递性的:我记录了一个带有“连接”的bug,其中涉及非常相似的破折号 - 其中 A 和 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)
【讨论】: