Ho un codice come questo:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Non mi interessa il caso. Dovrei usare OrdinalIgnoreCase
, InvariantCultureIgnoreCase
o CurrentCultureIgnoreCase
?
Ho un codice come questo:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Non mi interessa il caso. Dovrei usare OrdinalIgnoreCase
, InvariantCultureIgnoreCase
o CurrentCultureIgnoreCase
?
Risposte:
Da " Nuovi consigli per MSDN sull'uso delle stringhe in Microsoft .NET 2.0 " di MSDN
Riepilogo: i proprietari di codice che precedentemente utilizzavano il
InvariantCulture
confronto delle stringhe, il case e l'ordinamento dovrebbero prendere in seria considerazione l'utilizzo di un nuovo set diString
sovraccarichi in Microsoft .NET 2.0. In particolare, i dati progettati per essere indipendenti dalla cultura e irrilevanti dal punto di vista linguistico dovrebbero iniziare a specificare i sovraccarichi utilizzando i membriStringComparison.Ordinal
oStringComparison.OrdinalIgnoreCase
della nuovaStringComparison
enumerazione. Questi impongono un confronto byte per byte simile astrcmp
quello che non solo evita i bug dall'interpretazione linguistica di stringhe essenzialmente simboliche, ma fornisce prestazioni migliori.
"Straße"
e "STRASSE"
. Quando si usano OrdinalIgnoreCase
i Equals
ritorni false
, mentre InvariantCultureIgnoreCase
dice che sono uguali.
Confrontare le stringhe unicode è difficile:
L'implementazione di ricerche e confronti di stringhe Unicode nel software di elaborazione del testo deve tenere conto della presenza di punti di codice equivalenti. In assenza di questa funzione, gli utenti che cercano una particolare sequenza di punti di codice non sarebbero in grado di trovare altri glifi visivamente indistinguibili che hanno una rappresentazione di punti di codice diversa, ma canonicamente equivalente.
vedi: http://en.wikipedia.org/wiki/Unicode_equivalence
Se stai cercando di confrontare 2 stringhe unicode in un modo senza distinzione tra maiuscole e minuscole e vuoi che funzioni OVUNQUE , hai un problema impossibile.
L'esempio classico è il turco i , che quando viene maiuscolo diventa © (notare il punto)
Per impostazione predefinita, il framework .Net di solito utilizza CurrentCulture per funzioni correlate alle stringhe, con un'eccezione molto importante .Equals
che utilizza un confronto ordinale (byte per byte).
Ciò porta, in base alla progettazione, alle varie funzioni di stringa che si comportano in modo diverso a seconda della cultura del computer.
Tuttavia, a volte vogliamo un confronto "generico", senza distinzione tra maiuscole e minuscole.
Ad esempio, è possibile che il confronto delle stringhe si comporti allo stesso modo, indipendentemente dal computer su cui è installata l'applicazione.
Per raggiungere questo obiettivo abbiamo 3 opzioni:
Le regole di equivalenza Unicode sono complicate, il che significa che l'utilizzo del metodo 1) o 2) è più costoso di OrdinalIgnoreCase
. Il fatto che OrdinalIgnoreCase
non esegua alcuna normalizzazione unicode speciale, significa che alcune stringhe che vengono visualizzate allo stesso modo sullo schermo di un computer, non saranno considerate identiche. Ad esempio: "\u0061\u030a"
ed "\u00e5"
entrambi rendono å. Tuttavia in un confronto ordinale sarà considerato diverso.
La scelta più ampia dipende dall'applicazione che si sta creando.
Microsoft ha una serie di raccomandazioni con linee guida esplicite. Tuttavia, è davvero importante comprendere la nozione di equivalenza unicode prima di affrontare questi problemi.
Inoltre, tieni presente che OrdinalIgnoreCase è un tipo molto speciale di bestia, che sta selezionando e scegliendo un po 'di un confronto ordinale con alcuni aspetti lessicografici misti. Questo può essere fonte di confusione.
Immagino che dipenda dalla tua situazione. Poiché i confronti ordinali stanno effettivamente osservando i valori numerici Unicode dei caratteri, non saranno la scelta migliore quando si ordina in ordine alfabetico. Per i confronti di stringhe, tuttavia, ordinale sarebbe un po 'più veloce.
Dipende da ciò che si vuole, anche se mi piacerebbe rifuggire da InvariantCulture meno che non sei molto sicuro che non vorrete mai di localizzare il codice per le altre lingue. Utilizzare invece CurrentCulture.
Inoltre, OrdinalIgnoreCase dovrebbe rispettare i numeri, che possono o meno essere ciò che si desidera.
La risposta molto semplice è, a meno che tu non stia usando il turco, non è necessario utilizzare InvariantCulture.
Vedi il seguente link:
In C # qual è la differenza tra ToUpper () e ToUpperInvariant ()?