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?
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?
Prova questo:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Sono un newbie relativo StackOverflow - puoi spiegare cosa intendi aggiungendo un link? Intendi per i documenti MSDN? –
cavolo sei veloce .. lol stavo scrivendo la risposta che mi hai dato per primo = D – Erick
Puoi aggiungere un link MSDN (che di solito faccio) o se trovi post di blog interessanti o tali che potrebbero espandere la risposta. – Samuel
System.Collections.CaseInsensitiveComparer
o
System.StringComparer.OrdinalIgnoreCase
Questo ha effetto sull'intera applicazione? – GateKiller
No, solo quando lo si usa. – leppie
Dove posso trovare maggiori informazioni su questo. Questo significa che posso usare == per una corrispondenza senza distinzione tra maiuscole e minuscole? – GateKiller
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.
Questo è un po 'un brutto trucco imho ... –
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. –
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
persone riportano ToUpperInvariant() è più veloce di ToLowerInvariant().
L'invariante potrebbe essere una cattiva idea se la cultura corrente o quella desiderata ha regole speciali per la parte superiore della scatola. – OregonGhost
E anche la semantica è diversa. – leppie
Questo crea una nuova copia di ogni stringa? Se è così, cattiva idea. – cjk
È possibile utilizzare
if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
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
string.Compare(string1, string2, true)
Questo può avere problemi I18N. –
Ci sono una serie di proprietà nella classe statica StringComparer
che restituiscono comparatori per qualsiasi tipo di maiuscole e minuscole si potrebbe desiderare:
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
.
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.
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.
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
@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'. –
"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
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:
possibile duplicato del [maiuscole e minuscole confronto tra le stringhe in C#] (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal
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
Sarebbe davvero bello; dì per definire un corrispondente '~ =' a parallel '==' come versione insensibile alle maiuscole e alle minuscole. – eidylon