Подтвердить что ты не робот

Различные результаты сортировки по различным версиям CLR

При сравнении строк в С# разные 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

Я что-то пропустил?

4b9b3361

Ответ 1

Пожалуйста, убедитесь, что вы сортируете с MyList.Sort(StringComparer.Ordinal).

Если Unicode не начнет изменять код своих символов, он должен обеспечить постоянный порядок сортировки. Ordinal будет основываться на фактическом идентификаторе кода, который им был назначен.

Если я возьму ваш первый пример, сравнивая это:

-!
!-

Дефис U + 002D, а восклицательный знак U + 0021. Эти коды не изменились с по меньшей мере таблицами ASCII. Я бы рассмотрел возможность проверки ваших параметров сортировки, чтобы убедиться, что вы сравниваете только по порядковым, а не по фактическим нейтральным/конкретным культурам.