2013-02-19 8 views
16

Ich habe eine Frage im Zusammenhang mit Zeichenfolgenvergleich vs. Zeichenvergleich.String-Vergleich und alphabetische Reihenfolge der einzelnen Zeichen

Die Zeichen > und 0 (Null) haben die folgenden Dezimalwerte 62 und 48 entsprechend.

Wenn ich zwei Zeichen in dem folgenden Code vergleichen, bekomme ich Wert True (was richtig ist)

Console.WriteLine('>' > '0'); 

Als ich zwei Ein-Zeichenkette in dem folgenden Code vergleichen, bekomme ich Wert -1, die anzeigt, dass ">" kleiner als "0" (Standardkultur ist Englisch)

Console.WriteLine(string.Compare(">", "0")); 

Während Vergleich von "3" und "1" (51 und 49 Code valu n) in dem folgenden Code gibt 1 (wie erwartet)

Console.WriteLine(string.Compare("3", "1")); 

Auch string.Compare(string str1, string str2) Dokumentation sagt:

Der Vergleich der aktuellen Kultur verwendet kulturspezifische Informationen wie Gehäuse Regeln zu erhalten und die alphabetische Reihenfolge der einzelner Zeichen

Würden Sie in der Lage sein, zu erklären (oder Verweises auf einige Unterlagen zur Verfügung stellen), wie s Der Vergleich wird z. wie alphabetische Reihenfolge der einzelnen Zeichen berechnet usw.?

Antwort

14

Wenn Sie die Zeichen '>' und '0' vergleichen, vergleichen Sie ihre Ordinalwerte.

Um das gleiche Verhalten von einem String-Vergleich, liefert die Ordnungs Zeichenfolge Vergleichstyp zu erhalten:

Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal)); 
    Console.WriteLine(string.Compare(">", "0", StringComparison.InvariantCulture)); 
    Console.WriteLine(string.Compare(">", "0", StringComparison.CurrentCulture)); 

Die aktuelle Kultur wird verwendet standardmäßig die eine Sortierreihenfolge hat bestimmt Strings ‚alphabetisch‘ zu sortieren und nicht in streng lexikalische Reihenfolge, für eine Definition von alphabetisch.

0

es gibt -1 weil es str2 zu str1 Vergleich, nicht umgekehrt. ZB "ist 48 gleich 62". Nein, es ist weniger als 62, also gibt es -1 zurück. Es ist semantisch ein wenig verwirrend, wenn Sie die Parameterreihenfolge lesen

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/84787k22.aspx) sagt: „String.Compare (strA, strB) - Weniger als Null - strA weniger als strB. " Zum Beispiel ergibt 'string.Compare (" A "," B ")' '-1' -' "A" 'ist kleiner als' "B" '. Warum ist '"> "' kleiner als '" 0 "'? – dtb

+0

Ich habe meine Frage aktualisiert: Wenn Sie "3" mit "1" vergleichen, erhalten Sie den Wert "1", wobei "3" den Code 51 und "1" den Code 49 (wie erwartet) hat. Das passt also nicht zu deiner Erklärung. – Alexandar

+0

@Alexandar guter Punkt. Ich glaube, PeteKirkham hat darauf besser geantwortet als ich. – DiskJunky

17

Die Sortierreihenfolge der Zeichenfolgen hängt von der Kultur ab, die Sie verwenden.

StringComparer.CurrentCulture sortiert die folgenden 1-Zeichenketten wie auf meiner Maschine folgt:

' - ! " # $ % & () * , ./: ; ? @ [ 
\ ]^_ ` { | } ~ + <=> 0 1 2 3 4 5 6 
7 8 9 a A b B c C d D e E f F g G h H i 
I j J k K l L m M n N o O p P q Q r R s 
S t T u U v V w W x X y Y z Z 

StringComparer.Ordinal Sorten die gleichen Strings wie folgt:

! " # $ % & ' () * + , - ./0 1 2 3 
4 5 6 7 8 9 : ; <=> ? @ A B C D E F G 
H I J K L M N O P Q R S T U V W X Y Z [ 
\ ]^_ ` a b c d e f g h i j k l m n o 
p q r s t u v w x y z { | } ~ 
+5

Sie wissen nicht, was Ihre derzeitige Kultur ist, und das ist eine Schande. Ich kann sagen, dass es nicht "fy-NL" (Westfriesisch (Niederlande)) ist, weil dann der Buchstabe "y" neben dem "i" stehen würde. Es kann auch nicht "et-EE" (Estnisch (Estland)) sein, denn dann wäre das "z" neben dem "s". –

+0

Benutzer dtb befindet sich in Deutschland nach SO-Profil. –

2

Es klingt wie das, was Sie wollen, ist der Vergleich zu Verwenden Sie keine kulturspezifischen Regeln. Haben Sie StringComparison versucht?Ordinal:

Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal)); // returns a positive number 
Verwandte Themen