2015-02-25 6 views
13

Beim Vergleichen von Zeichenfolgen in C# gibt es unter Windows 7 sp1 x64 andere Ergebnisse mit unterschiedlichen Ergebnissen. Hier ist ein Beispielcode:Unterschiedliche Sortierergebnisse bei verschiedenen CLR-Versionen

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

Hier wird die Probe Ausgabe:


Wenn ich festlegen Ziel Framework 4.0:

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

-1 
-1 

Wenn ich festlegen Ziel Framework 2.0 :

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

1 
1 

Fehle ich etwas?

+0

In .NET 4.0 der Unicode von 5.0 auf 5.1 geändert, so ist das vielleicht der Unterschied. Leider gibt es sehr wenig Dokumentation zu diesem – xanatos

+4

'List.Sort()' verwendet den Standardvergleich, und der Standardvergleich für 'string' verwendet die aktuelle Kultur. Dies hängt wiederum von den Kollationstabellen ab, die mit .NET geliefert werden, und diese können sich ändern. Wenn Sie konsistente Ergebnisse wünschen, verwenden Sie einen ordinalenbasierten Vergleich ('List.Sort (StringComparer.Ordinal)'). –

+1

@JeroenMostert Das Problem ist sogar mit der InvariantCulture vorhanden, die "stabil" sein sollte – xanatos

Antwort

2

Bitte stellen Sie sicher, dass Sie mit der MyList.Sort(StringComparer.Ordinal) sortieren.

Wenn Unicode den Code ihrer Zeichen nicht ändert, sollte es eine konstante Sortierreihenfolge bereitstellen. Die Ordinalzahl basiert auf der tatsächlichen Code-ID, die ihnen zugewiesen wurde.

Wenn ich Ihr erstes Beispiel nehmen diese zu vergleichen:

-! 
!- 

Der Bindestrich ist U + 002D und das Ausrufezeichen ist U + 0021. Diese Codes haben sich seit mindestens den ASCII-Tabellen nicht geändert. Ich würde in Erwägung ziehen, Ihre Sortierparameter zu überprüfen, um sicherzustellen, dass Sie nur auf Ordnungszahl und nicht auf tatsächlichen neutralen/spezifischen Kulturen vergleichen.

Verwandte Themen