2015-02-25 23 views
13

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ś?

+0

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

+4

'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)'). –

+1

@JeroenMostert Problem występuje nawet w przypadku InvariantCulture, która powinna być "stabilna". – xanatos

Odpowiedz

2

Upewnij się, że sortujesz przy użyciu MyList.Sort(StringComparer.Ordinal).

Dopóki Unicode nie zacznie zmieniać kodu swoich znaków, powinien zapewnić stałą kolejność sortowania. Zwykły będzie oparty na faktycznym identyfikatorze kodu, który został do nich przypisany.

Jeśli wezmę swój pierwszy przykład Porównując to:

-! 
!- 

myślnik jest U + 002D i wykrzyknik U + 0021. Kody te nie zmieniły się od co najmniej tabel ASCII. Zastanowiłbym się nad sprawdzeniem parametrów sortowania, aby upewnić się, że porównujesz tylko porządek, a nie rzeczywistą neutralną/specyficzną kulturę.

Powiązane problemy