C# Case insensitive Contains string check
En este tutorial aprendemos diferentes maneras de hacer case insensitive string contains check en C#
Parece un problema sencillo, pero el método por defecto de C# string.Contains() distingue entre mayúsculas y minúsculas
Y si la cadena no está en el idioma Inglés es decir, para otros idiomas, no podemos comparar el texto insensible a las mayúsculas y minúsculas directamente
Las dos cadenas deben estar en la misma cultura y debemos conocer la cultura del idioma.
La mayoría de las veces compararemos cadenas en inglés solamente.
Método 1: Usando el método C# string.IndexOf().
Podemos usar el método C# string.IndexOf() para hacer la comprobación de la cadena insensible a mayúsculas y minúsculas.
IndexOf() el método acepta el parámetro StringComparison.OrdinalIgnoreCase, que especifica el tipo de búsqueda a utilizar para los caracteres.
string textToCheck = "STRING Contains";
bool contains = textToCheck.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
Método 2: Usando el método string.Contains() en .Net 5+ & .NET Core 2.0+
En las últimas versiones de dot net, es decir, en .Net Core 2.0+ y .Net 5+. El método string.Contains() tiene un método sobrecargado que acepta el parámetro StringComparison.
string textToCheck = "STRING Contains";
bool checkContains = textToCheck.Contains("string",StringComparison.OrdinalIgnoreCase);
Método 3: Usando el método Regex.IsMatch()
Podemos utilizar expresiones regulares para hacer la comprobación de la cadena que contiene sin distinguir entre mayúsculas y minúsculas.
Si está familiarizado con Regex, utilice el método Regex.IsMatch() y para comprobar la insensibilidad a mayúsculas y minúsculas pase el parámetro RegexOptions.IgnoreCase
var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = Regex.IsMatch(stringToCheck, Regex.Escape(substring), RegexOptions.IgnoreCase);
//true
Método 4: Usando .ToUpper() & .ToLower()
Si las cadenas están en inglés y el rendimiento no es un problema, podemos convertir ambas cadenas al mismo caso y luego hacer la comprobación de que la cadena contiene.
var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = stringToSearch.ToLower().Contains(substring.ToLower());
or
bool contains = stringToSearch.ToUpper().Contains(substring.ToUpper());
//true
C# Case insensitive Contains check para otros idiomas
La insensibilidad a las mayúsculas y minúsculas depende del idioma
Por ejemplo, en el idioma inglés I es la versión en mayúsculas de i.
Mientras que en el idioma turco la versión en mayúsculas de i es el carácter desconocido İ.
Para hacer la comprobación de la cadena sin distinguir entre mayúsculas y minúsculas tenemos que utilizar el objeto CultureInfo.
var text = "İ";
var check = "i";
CultureInfo trCulture = new CultureInfo("tr-TR",false);
bool englishContains = text.IndexOf(check, StringComparison.OrdinalIgnoreCase) >= 0;
//false
var turkishContains = trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;
//true
He creado el objeto CultureInfo para el idioma turco. Y comparé ambas cadenas usando CompareInfo como se muestra a continuación.
trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;
La mejor manera de hacer la comprobación de la cadena Contains insensible a mayúsculas y minúsculas
Si está utilizando la última versión de .Net utilice el método string.Contains().
De lo contrario, utilice el método string.IndexOf().
No prefiera los métodos .ToUpper() o To.Lower() ya que pueden provocar problemas de rendimiento.
Utilice el objeto CultureInfo para las cadenas de otros idiomas.