2013-05-17 8 views
5

Vergleich "I"Weird-String Sortierung, wenn der 2. String länger ist

string.Compare("î", "I ", StringComparison.CurrentCulture) -- returns -1 
string.Compare("î", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1 
string.Compare("î", "I", StringComparison.CurrentCulture) -- returns 1 (unexpected) 
string.Compare("î", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 1 (unexpected) 

Mit "i"

string.Compare("i", "I ", StringComparison.CurrentCulture) -- returns -1 
string.Compare("i", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1 
string.Compare("i", "I", StringComparison.CurrentCulture) -- returns -1 
string.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 0 

Aktuelle Kultur en-GB war. Ich würde erwarten, dass all diese Dinge zurückkehren würden. Warum verändert eine längere Zeichenfolge die Sortierreihenfolge?

+0

Eigentlich - wenn ich 'i' nicht 'i', erhalte ich folgendes Ergebnis: \t \t string.Compare ("i", "I", StringComparison.CurrentCulture) gibt \t -1 string.Compare ("i "," I ", StringComparison.CurrentCulture) -1 \t int –

+0

Aktualisieren Sie Ihre Frage mit diesen Informationen. – ChrisF

+0

Hast du es mit anderen Kulturen versucht? – Simon

Antwort

9

Siehe die UTS#10: Unicode Collation Algorithm für die vollständigen Details.

Insbesondere siehe Abschnitt 1.1 Multi-Level-Vergleich, der dieses Verhalten erklärt.

Es gibt eine dort Tabelle sind einige Beispiele, die zeigen, wie diese:

role < rôle < roles

, die Ihrem Beispiel mit "I" analog ist, "I" und "I", das heißt:

außer wo roles eine s am Ende hat, hat Ihr Beispiel einen Platz am Ende. Aber die gleiche Logik gilt; Es ist irrelevant, was der zusätzliche Charakter ist - die einfache Tatsache, dass ist, ein zusätzliches Zeichen macht es nach dem "î" sortiert.

Ein entscheidender Punkt von der Spezifikation ist:

Accent Unterschiede der Regel ignoriert werden, wenn die Basis Buchstaben unterscheiden.

Die Basisbuchstaben unterscheiden sich, wenn die Längen unterschiedlich sind, so dass die Akzentunterschiede in Ihren Beispielen mit dem Platz am Ende ignoriert werden.

Wenn jedoch die Strings die gleiche Länge haben, werden die Akzentunterschiede nicht ignoriert - was genau die Ergebnisse sind, die Sie sehen.

+2

Diese Antwort, und diese Seite, ist der Grund, warum niemand seine eigenen Sortier-/Vergleichsimplementierungen schreiben sollte, wenn es um kultursensible Listen geht. Zugegeben, es könnte Fehler in der .NET-Implementierung geben, aber ich würde garantieren, dass ich Fehler haben würde, wenn ich meine eigenen schreiben würde. Gute Antwort und gute Frage! –

2

Vom Documentation

Der Vergleich beendet, wenn eine Ungleichheit entdeckt wird oder beide Zeichenketten verglichen wurden. Wenn jedoch die beiden Zeichenfolgen gleich dem Ende einer Zeichenfolge sind und die andere Zeichenfolge Zeichen hat, wird die Zeichenfolge mit den verbleibenden Zeichen als größer angesehen. Der Rückgabewert ist das Ergebnis des letzten durchgeführten Vergleichs.

+0

string.Compare ("î", "I", StringComparison.CurrentCulture) - gibt 1 zurück string.Compare ("î", "I", StringComparison.CurrentCulture) - gibt -1 zurück Also - warum sind î und ich hielt das für gleich? –

+0

Es gibt etwas Besonderes an "î" - ich verstehe nicht, warum es 0 nicht zurückgibt, wenn es gleich "I" ist, oder wenn es nicht gleich ist, seine Antwort ändern, wenn die Länge länger ist ... –

0

Im Grunde, weil bei der Sortierung Saiten Länge

"a" zählt, ist kleiner als "a" nicht wahr? macht Sinn.

+0

Dort ist etwas besonderes über "î" - Ich verstehe nicht, warum es 0 nicht zurückgibt, wenn es gleich "I" ist, oder wenn es nicht gleich ist, seine Antwort ändern, wenn die Länge länger ist ... –

+0

Warum ist " "verglichen mit" I "+1, während" "verglichen mit" I "-1? –

+0

Sie wiederholt genau das gleiche, was meinst du? –

-1

Das Verhalten ist komisch, ich gebe dir das, aber ich sehe nicht, warum nicht Ordinal Vergleiche angesichts der internationalen Kontext hier impliziert verwenden. Für weitere Informationen lesen Sie bitte this article.

+0

Die Zeichenfolgen werden verwendet, um die Sortierreihenfolge in der Ansicht für einige Musikmetadaten anzugeben. Ich wollte, dass das Ergebnis kultursensibel ist. Ich denke, ich könnte es in einen Ordinalvergleich umwandeln ... –

+0

Für kultursensible Textanzeigen sind Ordnungsvergleiche und Ordnungen fast immer die falsche Wahl. –

Verwandte Themen