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

时间:2015-02-25 11:16:52

标签: c# .net

在比较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("-!"));

以下是示例输出:


如果我将Target Framework设置为4.0:

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

-1
-1

如果我将Target Framework设置为2.0:

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

1
1

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

请确保使用MyList.Sort(StringComparer.Ordinal)排序。

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

如果我把你的第一个例子比较一下:

-!
!-

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

相关问题