为什么" 1.0" < " -1.0" < " 1.1&#34 ;?

时间:2017-03-26 19:23:20

标签: c# .net

考虑以下代码片段:

var sorted = new[] { "-1.0", "0.0", "1.0", "1.1", "2.0" }
    .OrderBy (s => s)
    .ToArray ();
Console.WriteLine (string.Join (", ", sorted));

在我的系统上打印

0.0, 1.0, -1.0, 1.1, 2.0

鉴于-的Ascii代码小于数字' ascii代码我期望-1.0, 0.0, 1.0, 1.1, 2.0

这肯定让我感到困惑的是 -1.01.0之间1.1的原因。这两个字母以相同的字符开头,因此它们之间的任何内容都应该以{{1​​}}开头。

我模糊地怀疑文化或场所设置会影响这一点,但我的(一些德语和很多英语的混合物)在上述情况下可能与英语或Invariant没有区别。

1 个答案:

答案 0 :(得分:8)

根据MSDN文档String.Compare

  

来电者须知:字符集包含可忽略的字符。该   比较(字符串,的Int32,字符串的Int32,的Int32,CultureInfo的,CompareOptions)   方法在执行时不考虑这些字符   语言或文化敏感的比较。认识到可忽略的   比较中的字符,提供值   CompareOptions.Ordinal或CompareOptions.OrdinalIgnoreCase for   选项参数。

如果您添加StringComparer.Ordinal,它将按预期工作。

        var sorted = new[] { "-1.0", "0.0", "1.0", "1.1", "2.0" }
            .OrderBy(s => s, StringComparer.Ordinal)
            .ToArray();
        Console.WriteLine(string.Join(", ", sorted));

因为您可以看到-将被完全忽略,这意味着"-1.0""1.0"是相同的

另据MSDN CompareOptions Enumeration Remakrs

  

.NET Framework使用三种不同的排序方式:单词排序,   字符串排序和序数排序。单词排序执行文化敏感   字符串的比较。某些非字母数字字符可能有   分配给他们的特殊权重。例如,连字符(" - ")可能   有一个非常小的重量分配给它,以便" coop"和"合作社"   在排序列表中彼此相邻。字符串排序类似于   单词排序,除了没有特殊情况。所以,一切   非字母数字符号位于所有字母数字字符之前。   序数排序根据每个字符串的Unicode值比较字符串   字符串的元素。