2009-03-10 7 views
131

So che la segue è case sensitive:Esiste un operatore di uguaglianza tra maiuscole e minuscole C#?

if (StringA == StringB) { 

Così, c'è un operatore che metterà a confronto due stringhe in modo insensibile?

+0

possibile duplicato del [maiuscole e minuscole confronto tra le stringhe in C#] (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal

+0

Nel caso in cui qualcuno si imbattesse in questa domanda cercando un confronto senza distinzione tra maiuscole e minuscole per un dizionario , dai un'occhiata a questa domanda qui: [Accesso senza distinzione tra maiuscole e minuscole per dizionario generico] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic provvisorio) – Robotnik

+0

Sarebbe davvero bello; dì per definire un corrispondente '~ =' a parallel '==' come versione insensibile alle maiuscole e alle minuscole. – eidylon

risposta

240

Prova questo:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+0

Sono un newbie relativo StackOverflow - puoi spiegare cosa intendi aggiungendo un link? Intendi per i documenti MSDN? –

+0

cavolo sei veloce .. lol stavo scrivendo la risposta che mi hai dato per primo = D – Erick

+0

Puoi aggiungere un link MSDN (che di solito faccio) o se trovi post di blog interessanti o tali che potrebbero espandere la risposta. – Samuel

14
System.Collections.CaseInsensitiveComparer 

o

System.StringComparer.OrdinalIgnoreCase 
+0

Questo ha effetto sull'intera applicazione? – GateKiller

+0

No, solo quando lo si usa. – leppie

+2

Dove posso trovare maggiori informazioni su questo. Questo significa che posso usare == per una corrispondenza senza distinzione tra maiuscole e minuscole? – GateKiller

3

Operator? NO, ma penso che tu possa cambiare la tua cultura in modo che il confronto tra stringhe non sia sensibile al maiuscolo/minuscolo.

// you'll want to change this... 
System.Threading.Thread.CurrentThread.CurrentCulture 
// and you'll want to custimize this 
System.Globalization.CultureInfo.CompareInfo 

Sono sicuro che cambierà il modo in cui le stringhe vengono confrontate dall'operatore di uguale.

+4

Questo è un po 'un brutto trucco imho ... –

+0

Sì, per dire il minimo non è assolutamente quello che vorresti fare a meno che tu non voglia che tutti i confronti tra stringhe siano insensibili al maiuscolo/minuscolo. Ma penso che cambi il comportamento dell'operatore di uguaglianza. –

9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase); 
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) { 

persone riportano ToUpperInvariant() è più veloce di ToLowerInvariant().

+1

L'invariante potrebbe essere una cattiva idea se la cultura corrente o quella desiderata ha regole speciali per la parte superiore della scatola. – OregonGhost

+0

E anche la semantica è diversa. – leppie

+0

Questo crea una nuova copia di ogni stringa? Se è così, cattiva idea. – cjk

3

È possibile utilizzare

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase)) 
7

o

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) { 

, ma è necessario essere sicuri che Stringa non è nullo. Quindi probabilmente un uso migliore tu:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase); 

come John suggerito

EDIT: corretto il bug

0
string.Compare(string1, string2, true) 
+1

Questo può avere problemi I18N. –

16

Ci sono una serie di proprietà nella classe statica StringComparer che restituiscono comparatori per qualsiasi tipo di maiuscole e minuscole si potrebbe desiderare:

StringComparer Properties

Per esempio, è possibile chiamare

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2) 

o

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2) 

è un po 'più pulito rispetto alle string.Equals o string.Compare sovraccarichi che prendono un argomento StringComparison.

2

Sono così abituato a digitazione alla fine di questi metodi di confronto: , StringComparison.

così ho fatto una proroga.

namespace System 
{ public static class StringExtension 
    { 
     public static bool Equals(this string thisString, string compareString, 
      StringComparison stringComparison) 
     { 
      return string.Equals(thisString, compareString, stringComparison); 
     } 
    } 
} 

Basta notare che è necessario verificare la presenza di nulla su thisString prima di chiamare l'ext.

18

Il modo migliore per confrontare 2 stringhe ignorando il caso delle lettere è quello di utilizzare il metodo statico String.Equals specificando un ordinale ignorare comparatore caso stringa. Questo è anche il modo più veloce, molto più veloce della conversione delle stringhe in lettere minuscole o maiuscole e dopo averle confrontate.

Ho testato le prestazioni di entrambi gli approcci e il confronto delle stringhe del caso di ignoranza ordinale è stato più di 9 volte più veloce! È anche più affidabile della conversione di stringhe in lettere maiuscole o minuscole (controlla il problema con i turchi). Così sempre utilizzare il metodo String.Equals per confrontare le stringhe per l'uguaglianza:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase); 

Se si desidera eseguire una specifica stringa di confronto la cultura è possibile utilizzare il seguente codice:

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase); 

Si prega di notare che il secondo utilizza esempio la logica di confronto delle stringhe della cultura corrente, che la rende più lenta del confronto tra "caso di ignoranza ordinale" nel primo esempio, quindi se non hai bisogno di una logica di confronto di stringhe specifiche per cultura e sei in cerca di prestazioni massime, usa " confronto ordinale ignorare caso ".

Per ulteriori informazioni, read the full story on my blog.

+0

Non suggerire 'ToLower' o' ToLowerInvariant': creano memoria solo per eseguire un confronto, e possono fallire quando nuovi set di caratteri vengono aggiunti a Unicode. 'ToUpper' fallisce a causa della 'i' turca, tra gli altri; non c'è motivo per cui 'ToLower' non fallirà in futuro per ragioni simili. – antiduh

+0

@antiduh, grazie per il tuo commento. Molti di noi sono consapevoli di questi potenziali problemi, molti tutorial su Internet danno l'esempio della "i" turca. Come si vede nel mio post, non è consigliabile utilizzare i metodi 'ToLower' o' ToLowerInvariant', volevo solo mostrare quanto sia più efficiente il metodo 'String.Equals'. –

+3

"Molti di noi sono consapevoli di questi potenziali problemi, molti tutorial su Internet danno l'i turco come esempio" - non ci sono abbastanza persone, e lo stai ancora citando come seconda frase nella tua risposta. Inoltre, la tua * risposta * non include una giustificazione sufficiente per non usarla mai - basta menzionare la performance; le prestazioni non sono sempre la massima priorità. Di conseguenza, stai violando le linee guida del Centro assistenza; i collegamenti a siti esterni vanno bene, ma non si è sufficientemente riepilogato il contenuto (problema "i" turco). SO non è la tua piattaforma pubblicitaria. – antiduh

0

Altre risposte sono completamente valide qui, ma in qualche modo ci vuole del tempo per digitare StringComparison.OrdinalIgnoreCase e anche usando String.Compare.

ho codificato semplice metodo di estensione String, dove si poteva specificare se il confronto è case sensitive o un caso senza senso con booleano - vedi seguente risposta:

https://stackoverflow.com/a/49208128/2338477

Problemi correlati