Che è preferibile usare — StringComparison.OrdinalIgnoreCase o StringComparison.InvariantCultureIgnoreCase?

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

Domanda

Ho un po ' di codice come questo:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

Non mi interessa il caso.Devo usare OrdinalIgnoreCase, InvariantCultureIgnoreCase, o CurrentCultureIgnoreCase?

È stato utile?

Soluzione

Più recente .Net Docs ora ha una tabella per aiutarvi a decidere quale è meglio usare per la tua situazione.

Da MSDN s "Nuove Raccomandazioni per l'Utilizzo di Stringhe in Microsoft .NET 2.0"

Sommario:Codice proprietari in precedenza utilizzando il InvariantCulture per il confronto di stringhe, carcassa, e l'ordinamento dovrebbe fortemente considerare l'utilizzo di una nuova serie di String overload in Microsoft .NET 2.0. In particolare, i dati che è stato progettato per essere la cultura indipendente e linguisticamente irrilevante dovrebbe iniziare a specificare sovraccarichi utilizzando il StringComparison.Ordinal o StringComparison.OrdinalIgnoreCase i membri del nuovo StringComparison enumerazione.Questi imporre un byte per byte confronto di simile a strcmp che non solo evita bug di interpretazione linguistica di essenzialmente simbolica, stringhe, ma fornisce prestazioni migliori.

Altri suggerimenti

Tutto dipende

Il confronto di stringhe unicode è difficile:

L'attuazione della stringa Unicode ricerche e confronti nel testo il software di elaborazione deve prendere in conto della presenza di equivalente punti di codice.In assenza di questo funzionalità, gli utenti alla ricerca di un particolare punto di codice sequenza essere in grado di trovare altre visivamente indistinguibile glifi che hanno un diversi, ma canonicamente equivalente, codice punto di rappresentazione.

vedere: http://en.wikipedia.org/wiki/Unicode_equivalence


Se si tenta di confrontare 2 stringhe unicode in una distinzione tra maiuscole e minuscole modo e voglia di lavorare OVUNQUE, avete un problema impossibile.

L'esempio classico è il Ho turco, che quando uppercased diventa I (notare il punto)

Per impostazione predefinita, l' .Net framework di solito si usa il CurrentCulture per le stringhe relative funzioni, con una importante eccezione di .Equals che utilizza un numero ordinale (byte per byte) confrontare.

Questo porta, alla progettazione, per le varie funzioni di stringa di comportarsi in modo diverso a seconda della cultura.


Tuttavia, a volte ci vuole un "general purpose", distinzione tra maiuscole e minuscole, il confronto.

Per esempio, se si desidera che il confronto tra stringhe si comportano allo stesso modo, non importa quale computer è installata l'applicazione sul.

Per raggiungere questo obiettivo, abbiamo 3 opzioni:

  1. Impostare la cultura in modo esplicito ed effettuare una distinzione tra maiuscole e minuscole confrontare uso di unicode equivalenza regole.
  2. Impostare la cultura, la lingua inglese e di eseguire la distinzione tra maiuscole e minuscole confrontare uso di unicode equivalenza regole.
  3. Utilizzare OrdinalIgnoreCase che in maiuscolo stringa utilizzando la InvariantCulture e quindi eseguire un confronto byte per byte.

Unicode equivalenza regole sono complicate, il che significa che utilizzando il metodo 1) o 2) è più costoso di OrdinalIgnoreCase.Il fatto che OrdinalIgnoreCase non effettuare alcuna unicode normalization, significa che alcune stringhe che rendono allo stesso modo sullo schermo di un computer, non essere considerati identici.Per esempio: "\u0061\u030a" e "\u00e5" sia il rendering å.Tuttavia, in un numero ordinale di confrontare saranno considerati diversi.

Che si sceglie dipende in ampia misura dall'applicazione che si sta costruendo.

  • Se ho scritto una line-of-business app che è stato utilizzato solo da turco utenti, vorrei essere sicuro di utilizzare il metodo 1.
  • Se ho solo bisogno di una semplice "falso" minuscole confrontare, per dire un nome di colonna in un db, che è di solito in inglese, avrei probabilmente usare il metodo 3.

Microsoft è in ha di loro set di raccomandazioni con esplicita le linee guida.Tuttavia, è molto importante capire il concetto di unicode equivalenza prima di affrontare questi problemi.

Inoltre, si prega di tenere a mente che è un OrdinalIgnoreCase tipo molto speciale della bestia, che è in ripresa e la scelta di un po ' di un numero ordinale confrontare con alcuni mescolato in lexicographic aspetti.Questo può essere fonte di confusione.

MSDN rende alcuni abbastanza chiare raccomandazioni su questo: http://msdn.microsoft.com/en-us/library/ms973919.aspx

Immagino che dipende dalla vostra situazione.Dal numero ordinale confronti sono in realtà i caratteri numerici valori Unicode, non essere la scelta migliore quando sei ordinamento in ordine alfabetico.Per il confronto delle stringhe, anche se, ordinale sarebbe un po ' più veloce.

Dipende da quello che vuoi, però mi piacerebbe rifuggire da invariantculture a meno che non sei molto sicuro che non avrai mai voglia di localizzare il codice per le altre lingue.Utilizzare CurrentCulture invece.

Inoltre, OrdinalIgnoreCase, deve rispettare i numeri, che può o non può essere quello che vuoi.

La risposta molto semplice è, a meno che non si sta utilizzando il turco, non è necessario utilizzare InvariantCulture.

Si veda il seguente link:

In C# qual è la differenza tra ToUpper() e ToUpperInvariant()?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top