2013-02-19 26 views
16

Mam pytanie dotyczące porównywania ciągów znaków w porównaniu do porównywania znaków.Porównanie ciągów i kolejność alfabetyczna pojedynczych znaków

Znaki > i 0 (zero) mają odpowiednio następujące wartości dziesiętne 62 i 48.

Kiedy porównać dwa znaki w poniższym kodzie, otrzymuję wartość True (która jest poprawna)

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

Kiedy porównać dwa ciągi jedna postać w poniższym kodzie otrzymuję wartość -1 co oznacza, że ">" jest mniej niż "0" (domyślnie kultura jest angielski)

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

Zważywszy porównania "3" i "1" (51 i 49 kodu VALU ES) w następującym kodzie zwraca 1 (zgodnie z oczekiwaniami)

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

Również string.Compare(string str1, string str2) dokumentacja mówi:

Porównanie wykorzystuje obecną kulturę, aby uzyskać specyficzne kulturowo informacje, takie jak przepisy obudowa i kolejność alfabetyczna indywidualne znaki

Czy mógłbyś wyjaśnić (lub podać odniesienie do niektórych dokumentów) w jaki sposób s Porównanie zaimplementowane jest np. w jaki sposób kolejność alfabetyczna poszczególnych znaków jest obliczana itp?

Odpowiedz

14

Podczas porównywania znaków '>' i '0' porównujesz ich wartości porządkowe.

Aby uzyskać takie samo zachowanie z porównania strun dostarczyć porządkowej typ porównania ciąg:

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

Obecna kultura jest używany domyślnie, który ma porządek sortowania przeznaczone do sortowania ciągi „alfabetycznie” raczej w ściśle leksykalny porządek, dla jakiejś definicji alfabetycznie.

0

zwraca -1, ponieważ porównuje str2 do str1, a nie odwrotnie. Np. "Wynosi 48 równe 62". Nie, jest mniej niż 62, więc zwraca -1. Jest to trochę mylące po przeczytaniu wartości parametru

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/84787k22.aspx) mówi „String.Compare (Stra, Strb) - Mniej niż zero - Stra jest mniej niż strB. " Na przykład 'string.Compare (" A "," B ")' zwraca '-1' -' "A" 'jest mniejsze niż' "B" '. Dlaczego ''> "' less than '" 0 "'? – dtb

+0

Zaktualizowałem moje pytanie: gdy porównasz "3" do "1", otrzymasz wartość "1", gdzie "3" ma kod 51, a "1" kod 49 (zgodnie z oczekiwaniami). To nie pasuje do twojego wyjaśnienia. – Alexandar

+0

@Alexandar dobry punkt. Myślę, że PeteKirkham odpowiedział na to lepiej niż ja – DiskJunky

17

Kolejność sortowania łańcuchów zależy od kultury, której używasz.

StringComparer.CurrentCulture sortuje następujące ciągi 1-znakowe w następujący sposób na moim komputerze:

' - ! " # $ % & () * , ./: ; ? @ [ 
\ ]^_ ` { | } ~ + <=> 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 sortuje te same ciągi następująco:

! " # $ % & ' () * + , - ./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

Nie poinformowałeś nas, jaka jest twoja obecna kultura, a to wstyd. Mogę powiedzieć, że nie jest to "" fy-NL "' (West Frisian (Holandia)), ponieważ wtedy litera 'y' byłaby obok' i'. Ponadto nie może to być "" et-EE "(estoński (Estonia)), ponieważ wtedy' z' byłby obok 's'. –

+0

Użytkownik dtb znajduje się w Niemczech zgodnie z profilem SO. –

2

Brzmi jak co chcesz jest porównanie nie używaj zasad specyficznych dla kultury. Czy próbowałeś StringComparison?Porządkowa:

Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal)); // returns a positive number 
Powiązane problemy