2013-05-17 8 views
5

Confrontando "i"stringa Strano ordinamento quando 2a corda è più lunga

string.Compare("î", "I ", StringComparison.CurrentCulture) -- returns -1 
string.Compare("î", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1 
string.Compare("î", "I", StringComparison.CurrentCulture) -- returns 1 (unexpected) 
string.Compare("î", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 1 (unexpected) 

con "i"

string.Compare("i", "I ", StringComparison.CurrentCulture) -- returns -1 
string.Compare("i", "I ", StringComparison.CurrentCultureIgnoreCase) -- returns -1 
string.Compare("i", "I", StringComparison.CurrentCulture) -- returns -1 
string.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase) -- returns 0 

cultura attuale it-IT. Mi aspetto che tutto ciò restituisca 1. Perché avere una stringa più lunga cambia l'ordinamento?

+0

In realtà - quando uso 'i' non 'i', ottengo il seguente risultato: \t \t string.Compare ("i", "I", StringComparison.CurrentCulture) restituisce \t -1 string.Compare ("i "," I ", StringComparison.CurrentCulture) -1 \t int –

+0

Aggiorna la tua domanda con queste informazioni. – ChrisF

+0

Hai provato con altre culture? – Simon

risposta

9

Vedere UTS#10: Unicode Collation Algorithm per tutti i dettagli.

In particolare, vedere la sezione 1.1 Confronto multi-livello che spiega questo comportamento.

C'è un tavolo ci mostra alcuni esempi, come questa:

role < rôle < roles

Questo è analogo a tuo esempio con "I", "i" e "I", vale a dire:

"I" < "î" < "I "

eccetto dove roles ha un s alla fine, l'esempio ha uno spazio alla fine. Ma vale la stessa logica; è irrilevante ciò che è il personaggio in più - il semplice fatto che ci sia è un carattere extra lo rende in ordine DOPO la "ì".

Un punto cruciale dalla specifica è:

differenze di accento sono tipicamente ignorate, se le lettere di base differiscono.

Le lettere di base differiscono se le lunghezze differiscono, quindi le differenze di accento vengono ignorate negli esempi con lo spazio alla fine.

Tuttavia, se le stringhe sono della stessa lunghezza, le differenze di accento sono non essere ignorato - che è esattamente il risultato che state vedendo.

+2

Questa risposta, e quella pagina, è il motivo per cui nessuno dovrebbe scrivere le proprie implementazioni di ordinamento/confronto di testo quando si tratta di elenchi sensibili culturali. Certo, potrebbero esserci dei bug nell'implementazione .NET, ma potrei garantire che avrei dei bug se avessi scritto il mio. Buona risposta e buona domanda! –

2

Dal Documentation

Il confronto termina quando una disuguaglianza viene scoperto o entrambe le stringhe sono stati confrontati. Tuttavia, se le due stringhe si confrontano alla fine di una stringa e l'altra stringa ha caratteri rimanenti, la stringa con caratteri rimanenti viene considerata maggiore. Il valore di ritorno è il risultato dell'ultimo confronto eseguito.

+0

string.Compare ("î", "I", StringComparison.CurrentCulture) - restituisce 1 string.Compare ("î", "I", StringComparison.CurrentCulture) - restituisce -1 Quindi - perché sono? e ho ritenuto uguale? –

+0

C'è qualcosa di speciale in "î" - Non capisco perché non restituisce 0 se è considerato uguale a "I", o se non è uguale, cambia la sua risposta quando la lunghezza è più lunga ... –

0

Fondamentalmente perché durante l'ordinamento lunghezza stringhe conta

"a" è più piccolo di "un" diritto? ha senso.

+0

Là è qualcosa di speciale su "î" - Non capisco perché non restituisce 0 se è considerato uguale a "I", o se non è uguale, cambia la sua risposta quando la lunghezza è più lunga ... –

+0

Perché è " "" rispetto a "I" +1, mentre "î" rispetto a "I" -1? –

+0

hai ripetuto esattamente lo stesso, cosa intendi? –

-1

Il comportamento è strano, ti darò quello, ma non vedo perché non utilizzare Ordinal confronti dato il contesto internazionale implicita qui.

Per ulteriori informazioni, leggere this article.

+0

Le stringhe vengono utilizzate per fornire l'ordinamento nella vista per alcuni metadati musicali. Volevo che il risultato fosse culturalmente sensibile. Credo che potrei cambiarlo in un confronto ordinale ... –

+0

Per le visualizzazioni di testo sensibili alla cultura, i confronti ordinali e l'ordinamento è quasi sempre la scelta sbagliata. –

Problemi correlati