排序的特殊性

Ale*_*rov 3 .net c#

字符的'-'代码是45,字符的代码'a'是97.很明显'-' < 'a'是真的.

Console.WriteLine((int)'-' + " " + (int)'a');
Console.WriteLine('-' < 'a');
Run Code Online (Sandbox Code Playgroud)

45 97

因此,以下排序的结果是正确的

var a1 = new string[] { "a", "-" };
Console.WriteLine(string.Join(" ", a1));
Array.Sort(a1);
Console.WriteLine(string.Join(" ", a1));
Run Code Online (Sandbox Code Playgroud)

a -
- a

但为什么以下类型的结果是错误的?

var a2 = new string[] { "ab", "-b" };
Console.WriteLine(string.Join(" ", a2));
Array.Sort(a2);
Console.WriteLine(string.Join(" ", a2));
Run Code Online (Sandbox Code Playgroud)

ab -b
ab -b

Kei*_*las 5

-被忽略,

so - = "" < a
and -b = "b" > "ab"
Run Code Online (Sandbox Code Playgroud)

这是因为文化排序(默认)

https://msdn.microsoft.com/en-us/library/system.globalization.compareoptions(v=vs.110).aspx

The .NET Framework uses three distinct ways of sorting: word sort, string  
Run Code Online (Sandbox Code Playgroud)

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