不同的CLR版本会产生不同的排序结果

use*_*639 13 .net c#

在比较C#中的字符串时,不同的clr在Windows 7 sp1 x64上给出了不同的结果.这是示例代码:

List<string> myList = new List<string>();
myList.AddRange(new[] { "!-", "-!", "&-l", "&l-", "-(", "(-", "-*", "*-", ".-", "-.", "/'", "-/" });
myList.Sort();
Console.WriteLine(Environment.Version);
myList.ForEach(Console.WriteLine);
Console.WriteLine();
Console.WriteLine(string.Compare("!-", "-!"));
Console.WriteLine("!-".CompareTo("-!"));
Run Code Online (Sandbox Code Playgroud)

以下是示例输出:


如果我将Target Framework设置为4.0:

4.0.30319.18444
!-
-!
&l-
&-l
(-
-(
*-
-*
.-
-.
/'
-/

-1
-1
Run Code Online (Sandbox Code Playgroud)

如果我将Target Framework设置为2.0:

2.0.50727.5485
-!
!-
&-l
&l-
-(
(-
-*
*-
-.
.-
-/
/'

1
1
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Max*_*ler 2

请确保您使用 进行排序MyList.Sort(StringComparer.Ordinal)

除非 Unicode 开始更改其字符的代码,否则它应该提供恒定的排序顺序。序号将基于分配给它们的实际代码 ID。

如果我拿你的第一个例子来比较:

-!
!-
Run Code Online (Sandbox Code Playgroud)

连字符是U+002D,感叹号是U+0021。至少自 ASCII 表以来这些代码就没有改变过。我会考虑检查您的排序参数,以确保您仅比较序数而不是实际的中性/特定文化。