2012-11-08 24 views
10

Eventuali duplicati:
Why does string.Compare seem to handle accented characters inconsistently?stringa di confronto parziale

Ho il seguente codice

var s1 = "ABzzzzz2"; 
var s2 = "äbzzzzz1"; 

var cmp = StringComparison.InvariantCultureIgnoreCase; 

Console.WriteLine(string.Compare(s1, 0, s2, 0, 7, cmp)); //prints -1 
Console.WriteLine(string.Compare(s1, 0, s2, 0, 8, cmp)); //prints 1 

Come potrebbe essere che una parte della prima stringa è inferiore a parte del secondo, mentre l'intera prima corda è maggiore dell'intero secondo?
L'ho provato su x64, .net 2.0, 3.5, 4.0

+1

Mi sembra che i numeri alla fine abbiano la precedenza nella definizione dell'ordine. –

+1

@Jan Stesso risultato con '2' sostituito con' b', '1' di' a'. – Rawling

+2

Puoi semplificare il tuo esempio: 'var s1 =" a2 "; var s2 = "ä1"; 'A proposito, l'Umlaut conta. –

risposta

1

La mia teoria è che l'algoritmo normalizza prima le stringhe e quindi esegue il confronto. Secondo questo "äbzzzzz1" è normalizzato come "abzzzzz1". Il primo confronto nella forma normalizzata risulta nell'uguaglianza, ma il ritorno 0 non sarebbe corposo poiché le stringhe reali non sono uguali. Quindi ritorna al confronto ordinale e ai risultati -1.

Nel secondo caso, dopo la normalizzazione, è chiaro che "abzzzzz2" è maggiore di "abzzzzz1" in modo che il risultato è 1.

Questo approccio spiega anche casi menzionati this question Per normalizzazione dettagli controllare MSDN page

Problemi correlati