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.