2013-02-19 13 views
16

Ho una domanda relativa al confronto tra stringhe e confronto caratteri.Confronto tra stringhe e ordine alfabetico dei singoli caratteri

I caratteri > e 0 (zero) hanno i seguenti valori decimali 62 e 48 di conseguenza.

Quando metto a confronto due personaggi nel seguente codice, ottengo il valore True (che è corretto)

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

Quando metto a confronto due stringhe di un carattere nel codice seguente, ottengo valore -1 che indica che ">" è minore di "0" (cultura di default è l'inglese)

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

Mentre confronto e "1" (valu "3" 51 e 49 codice ES) nel codice seguente restituisce 1 (come previsto)

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

Inoltre, string.Compare(string str1, string str2) documentazione dice:

Il confronto utilizza la cultura corrente per ottenere specifici cultura informazioni quali regole involucro e la ordine alfabetico caratteri individuali

Sarebbe in grado di spiegare (o fornire riferimento ad alcuni documenti) come il confronto tring è implementato per es. come viene calcolato l'ordine alfabetico dei singoli caratteri ?

risposta

14

Quando si confrontano i caratteri '>' e '0', si confrontano i loro valori ordinali.

Per ottenere lo stesso comportamento da un confronto di stringhe, assicurare il tipo di confronto stringa ordinale:

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

La cultura corrente è utilizzato di default, che ha un ordinamento destinato a ordinare le stringhe 'ordine alfabetico' piuttosto ordine rigorosamente lessicale, per una definizione alfabetica.

0

restituisce -1 perché sta confrontando str2 a str1, non viceversa. Ad esempio, "è 48 uguale a 62". No, è inferiore a 62 quindi restituisce -1. È semanticamente un po 'di confusione quando si legge l'ordine dei parametri

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/84787k22.aspx) dice "String.Compare (Stra STRB) - Meno di zero - strA è meno di strB. " Ad esempio, 'string.Compare (" A "," B ")' restituisce '-1' -' "A" 'è minore di' "B" '. Perché ''>> 'minore di' "0" '? – dtb

+0

Ho aggiornato la mia domanda: quando confronti "3" a "1" ottieni il valore '1' dove" 3 "ha il codice 51 e" 1 "ha il codice 49 (come previsto). In modo che non corrisponda alla tua spiegazione. – Alexandar

+0

@Alexandar buon punto. Penso che PeteKirkham abbia risposto meglio di quanto ho fatto io. – DiskJunky

17

L'ordinamento delle stringhe dipende dalla cultura utilizzata.

StringComparer.CurrentCulture ordina le seguenti stringhe di 1 caratteri come segue sulla mia macchina:

' - ! " # $ % & () * , ./: ; ? @ [ 
\ ]^_ ` { | } ~ + <=> 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 specie le stesse stringhe come segue:

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

Non ci informi di quale sia la tua cultura attuale, ed è un peccato. Posso dire che non è "fy-NL" (Frisone occidentale (Paesi Bassi)), perché allora la lettera "y" sarebbe accanto alla "i". Inoltre, non può essere '" et-EE "' (estone (Estonia)), per allora il 'z' sarebbe vicino al' s'. –

+0

Utente dtb si trova in Germania secondo il profilo SO. –

2

Sembra che ciò che si vuole è il confronto con non utilizzare regole specifiche della cultura. Hai provato StringComparison.Ordinale:

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