Porównywanie ciągów znaków w języku C#, różni użytkownicy uzyskują różne wyniki w systemie Windows 7 sp1 x64. Oto przykładowy kod:Różne wyniki sortowania w różnych wersjach CLR
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("-!"));
Oto przykładowe dane wyjściowe:
Jeżeli ustawić Framework docelowa do 4,0:
4.0.30319.18444
!-
-!
&l-
&-l
(-
-(
*-
-*
.-
-.
/'
-/
-1
-1
Jeżeli ustawić Framework docelowa do 2,0 :
2.0.50727.5485
-!
!-
&-l
&l-
-(
(-
-*
*-
-.
.-
-/
/'
1
1
Czy brakuje mi czegoś?
W .NET 4.0 kod Unicode został zmieniony z wersji 5.0 na 5.1, więc być może taka jest różnica. Niestety jest bardzo mało dokumentacji na temat tego – xanatos
'List.Sort()' używa domyślnego porównywalnika, a domyślny porównywalnik 'ciągu' używa aktualnej kultury. To z kolei zależy od tabel zestawień dostarczanych z platformą .NET, a te mogą ulec zmianie. Jeśli chcesz uzyskać spójne wyniki, użyj porównania opartej na liczbie porządkowej ('List.Sort (StringComparer.Ordinal)'). –
@JeroenMostert Problem występuje nawet w przypadku InvariantCulture, która powinna być "stabilna". – xanatos