考虑以下代码片段:
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.0
和1.0
之间1.1
为的原因。这两个字母以相同的字符开头,因此它们之间的任何内容都应该以{{1}}开头。
我模糊地怀疑文化或场所设置会影响这一点,但我的(一些德语和很多英语的混合物)在上述情况下可能与英语或Invariant没有区别。
答案 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值比较字符串 字符串的元素。