考虑以下代码片段:
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.0和1.1.那两个以相同的char开头,所以它们之间的任何东西都应该以a开头1.
我隐约怀疑文化或场所设置会影响这一点,但我的(一些德语和很多英语的混合物)在上述情况下可能与英语或Invariant没有区别.
根据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值比较字符串.