In C# ti sarai accorto che la funzione “Contains” è utilissima per verificare se una stringa contiene una sottostringa, ma non è case insensitive. In parole meno tecnichesi, se la sottostringa è maiuscola o minuscola fa differenza. In questo articolo scopriamo come risolvere questo problema.
Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!
Come detto a inizio articolo, il metodo “Contains” in C# è veramente tanto utile: ma presenta qualche problemuccio legato al fattore case insensitive. Ti faccio un esempio diretto qua sotto:
string stringaDoveCercare = "AIUTATEMI";
bool risultato = stringaDoveCercare.Contains("temi");
Purtroppo, la variabile “risultato” sarà false. Se vedi bene la variabile “stringaDoveCercare” al suo interno contiene la stringa “temi”, ma in maiuscolo.
Tramite la seconda riga, noi invochiamo il metodo “Contains” usando come sottostringa la stringa “temi” che è tutta in minuscolo.
Il risultato tornato dal metodo “Contains” sarà “falso” perchè appunto non è case insensitive. Se volessimo fare una traduzione “alla bella e buona e letterale“, questo metodo è letteralmente “insensibile” alla differenza tra maiuscolo e minuscolo.
Povere stringhe, sempre maltrattate…
Che facciamo? Ci arrendiamo? Ovviamente no!
Usiamo Culture come alternativa case insensitive
No, non ha niente a che vedere con la cultura. Sto parlando della classe CultureInfo!
Se non sai di cosa sto parlando, ti invito a fare i giusti approfondimenti sulla documentazione Microsoft a distanza di un click esattamente qui.
In altre parole, riprendendo il caso di prima:
string stringaDoveCercare = "AIUTATEMI";
string parolaDaCercare = "temi";
int risultato = culture.CompareInfo.IndexOf(stringaDoveCercare, parolaDaCercare, CompareOptions.IgnoreCase);
In questo caso dobbiamo usare una variabile di tipo intero. Questo perché il metodo “IndexOf” restituisce la posizione in cui si trova la sottostringa che stiamo cercando.
Ovviamente, se la variabile “risultato” contiene un numero maggiore di zero, vuol dire che la sottostringa è all’interno della stringa in cui stiamo cercando!
Ma non è l’unico modo, vediamone un altro.
OrdinalIgnoreCase è ancora più insensitive!
Esiste un’altra classe in C# che permette di avere un’alternativa case insensitive al metodo “Contains” di C#.
La classe in questione è “StringComparison” e come suggerisce il nome veramente poco tecnichese, permette di effettuare comparazioni fra stringhe con determinate condizioni (che ovviamente dettiamo noi).
Ciò detto:
string stringaDoveCercare = "AIUTATEMI";
string parolaDaCercare = "temi";
int risultato = stringaDoveCercare.IndexOf(stringaDoveCercare, parolaDaCercare, StringComparison.OrdinalIgnoreCase);
E come puoi ben notare, ci riduce anche di molto la complessità di lettura del codice! 😀