我知道之前已经注意到这个问题,或多或少简洁,但我仍然创建这个新线程,因为我在编写单元测试时再次遇到了这个问题.
默认的字符串比较(即文化相关的区分大小写的比较,我们得到有string.CompareTo(string),Comparer<string>.Default,StringComparer.CurrentCulture,string.Compare(string, string)等)违反及物当字符串包含连字符(或减号,我说的是普通的U + 002D字符).
这是一个简单的复制品:
static void Main()
{
const string a = "fk-";
const string b = "-fk";
const string c = "Fk";
Console.WriteLine(a.CompareTo(b)); // "-1"
Console.WriteLine(b.CompareTo(c)); // "-1"
Console.WriteLine(a.CompareTo(c)); // "1"
var listX = new List<string> { a, b, c, };
var listY = new List<string> { c, a, b, };
var listZ = new List<string> { b, c, a, };
listX.Sort();
listY.Sort();
listZ.Sort();
Console.WriteLine(listX.SequenceEqual(listY)); // "False" …Run Code Online (Sandbox Code Playgroud) 如果我有一些字符串列表包含所有数字和破折号,他们将按升序排序:
s = s.OrderBy(t => t).ToList();
Run Code Online (Sandbox Code Playgroud)
66-0616280-000
66-0616280-100
66-06162801000
66-06162801040
这是预期的.
但是,如果字符串包含字母,则排序有些出乎意料.例如,这里是相同的字符串列表,尾随A代替0,是的,它是排序的:
66-0616280-00A
66-0616280100A
66-0616280104A
66-0616280-10A
我原以为他们会这样排序:
66-0616280-00A
66-0616280-10A
66-0616280100A
66-0616280104A
当字符串包含字母时,为什么排序在字符串上的行为不同?
提前致谢.