【问题标题】:What should these comparisons return?这些比较应该返回什么?
【发布时间】:2008-11-05 06:45:24
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net string comparison


    【解决方案1】:

    来自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)

    【讨论】:

      【解决方案2】:

      好吧,忽略破折号是很无辜的。如果你想包含它们,也许在重载中使用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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-30
        • 2018-11-09
        • 2013-05-24
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        相关资源
        最近更新 更多