排序的特殊性

时间:2016-09-23 05:17:05

标签: c# .net

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

Console.WriteLine((int)'-' + " " + (int)'a');
Console.WriteLine('-' < 'a');
  

45 97
  真

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

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

a -
   - 一个

但为什么以下排序的结果是错误的?

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

ab -b
  ab -b

1 个答案:

答案 0 :(得分:5)

忽略-

so - = "" < a
and -b = "b" > "ab"

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

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  
     

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