2010-02-11 14 views
14

Ich nahm immer an, dass .Net lexikografisch Strings nach der aktuellen Kultur vergleicht. Aber es ist etwas seltsam, wenn eine der Saiten endet am ‚-‘:String-Vergleich in .Net: "+" vs "-"

"+".CompareTo("-") 
Returns: 1 

"+1".CompareTo("-1") 
Returns: -1 

ich es eine alle Kulturen bekomme ich versucht, einschließlich der Invarianten ein. Kann mir jemand erklären, was vor sich geht, und wie kann ich die beständige Zeichen-für-Zeichen-Anordnung für das aktuelle Gebietsschema erhalten?

+0

Gleiches für '" x + ". CompareTo (" x - ")' und '" x + 1 ".CompareTo (" x-1 ")' –

Antwort

7

Wechsel ist es nicht unbedingt eine konsistenten Zeichen-für-Zeichen Bestellung für einen bestimmten locale.

Vom MSDN documentation:

Zum Beispiel könnte eine Kultur festlegen, dass bestimmte Kombinationen von Zeichen als ein einzelnes Zeichen behandelt werden, oder Groß- und Kleinbuchstabe in einer bestimmten Art und Weise verglichen werden, oder dass die Sortierreihenfolge eines Zeichens hängt von den Zeichen ab, die ihm vorausgehen oder folgen.

Die einzige Möglichkeit, konsistente Charakter-by-Charakter Ordnung, um sicherzustellen, ist durch einen Ordinalvergleich verwenden, wie in Anton's answer demonstriert.

+0

zu bekommen Das erklärt die Sache. Das einzige, worüber ich mich wundere, ist, warum in aller Welt diese magische Behandlung für Allzweckzeichen wie ASCII minus eingeführt werden muss? – jmster

+0

@jmster: Meine Vermutung ist, dass die '+' und '-' Zeichen nichts isoliertes bedeuten, also findet in dieser Situation ein ordinaler Vergleich statt, wobei' + '(Code 43) zu" less than "auswertet -' (Code 45). Wenn jedoch die Zeichen "+" und "-" einer Zahl vorangestellt werden, nehmen sie eine Bedeutung an, und in dieser Situation findet ein "semantischer" und/oder numerischer Vergleich statt, wobei "+ 1" größer als "-1" ist. – LukeH

+0

Eigentlich ist es das Gegenteil, .NET verwendet ASCII-Reihenfolge, um zu schlussfolgern, dass "+1" kleiner als "-1" ist, aber in der endgültigen Position minus wird in Bindestrich, so dass "-" irgendwo zwischen "\ a "(Glocke) und" "(Leerstelle). – jmster

10

versuchen, dies zu

string.Compare("+", "-", StringComparison.Ordinal); // == -2 
string.Compare("+1", "-1", StringComparison.Ordinal); // == -2 
+1

Danke Anton, aber Ordinal bedeutet die alte gute ASCII-Sortierung, mit Großbuchstaben vor Großbuchstaben. string.Compare ("a", "Z", StringComparison.Ordinal); In meinem Locale, die Groß- und Kleinschreibung Reihenfolge ist so etwas wie 'a' <'A' <'ä' <'Ä' <... <'z' <'Z', aber ich sehe jetzt um direkt darauf zugreifen zu können. – jmster

+0

jmster: Warum schreibst du nicht deine eigene Sorte? Machst du dir nur Sorgen über Zahlen? –

+0

Ich habe meine eigene Methode geschrieben, aber unten brauche ich eine Möglichkeit, die Zeichen nach den lokalen Regeln zu vergleichen. Und ich möchte die Locales nicht von Hand codieren, es sollte möglich sein, es von Windows – jmster

3
 string.Compare("+", "-"); 
     string.Compare("+", "-", StringComparison.CurrentCulture); 
     string.Compare("+", "-", StringComparison.InvariantCulture); 
     string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase); 

     // All Pass 

die beiden Werte gleich sind, da werden inguisitic Gehäuse berücksichtigt werden

FIX:

die invariant gegenüber einer ordinale comparison.This Replacemittel die Entscheidungen basieren auf einfachen Byte-Vergleichen und ignorieren Tabellen- oder Äquivalenztabellen, die durch Kultur parametrisiert werden.

Referenz: Use ordinal StringComparison

string.Compare ("+", "-", StringComparison.Ordinal); // Fehler

0

Verwenden Sie CompareOrdinal. z. B.

String.CompareOrdinal("+1","-1"); 
-2 
String.CompareOrdinal("+","-"); 
-2 
2

Wahrscheinlich möchten Sie das echte Minuszeichen, Unicode-Codepunkt \ u2212, verwenden. Das Minuszeichen, das Sie beim Programmieren verwenden (\ u002d), ist ein "Bindestrich-Minus", seine Reihenfolge ist kontextabhängig, weil es auch häufig als Bindestrich verwendet wird. Es gibt mehr als Sie über die vielen verschiedenen Arten von Bindestrichen in this article wissen wollen.

+1

Ihre Beobachtung ist absolut korrekt, die Unicode-Leute scheinen besser zu wissen, wie jedes Zeichen verwendet werden muss. Es ist der Fehler der Benutzer, dass sie sich nicht an Unicode-Nummern erinnern und die Zeichen verwenden, die sie auf der Tastatur sehen. – jmster

+0

Typografie und Programmiersprachen sind immer noch eine Welt für sich. Vielleicht wird sich das irgendwann ändern, es wird eine Weile dauern. Es gibt viele Alt + Tastenkombinationen, um diese Art von Unicode-Codepunkten einzugeben, ironischerweise nicht für das Minuszeichen. –