为什么"1.0"<"-1.0"<"1.1"?

maf*_*afu 3 .net c#

考虑以下代码片段:

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

在我的系统上打印

0.0, 1.0, -1.0, 1.1, 2.0
Run Code Online (Sandbox Code Playgroud)

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

这肯定让我困惑,为什么-1.0之间 1.01.1.那两个以相同的char开头,所以它们之间的任何东西都应该以a开头1.

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

Mic*_*han 8

根据MSDN Docs String.Compare:

呼叫者注释:字符集包括可忽略的字符.Compare(String,Int32,String,Int32,Int32,CultureInfo,CompareOptions)方法在执行语言或文化敏感比较时不考虑这些字符.要识别比较中的可忽略字符,请为options参数提供CompareOptions.Ordinal或CompareOptions.OrdinalIgnoreCase的值.

如果添加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));
Run Code Online (Sandbox Code Playgroud)

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

另外根据MSDN CompareOptions Enumeration Remakrs

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