.Contains() sin distinción de mayúsculas y minúsculas en C#: 5 mejores formas en 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué el .Contains() normal le fallará (y cómo solucionarlo)

\n\n

Imagine: está escribiendo una búsqueda en un catálogo de libros en C#. El usuario escribe «Tolstói», pero en la base de datos está almacenado «tolstói» en minúsculas. El string.Contains("Tolstói") normal devolverá false. ¿Le suena familiar? Esta pregunta ha obtenido miles de visitas en Stack Overflow, y con razón. En 2025, cuando .NET ofrece potentes herramientas para trabajar con cadenas, usar el enfoque antiguo significa perder usuarios y rendimiento.

\n\n

En este artículo, analizaremos las 5 mejores formas de hacer que .Contains() no distinga entre mayúsculas y minúsculas en C#. Aprenderá qué método elegir para máxima velocidad y cuál para un funcionamiento correcto con diferentes idiomas. ¡Comencemos!

\n\n

El problema: ¿por qué .Contains() distingue entre mayúsculas y minúsculas de forma predeterminada?

\n\n

En C#, el método string.Contains() utiliza de forma predeterminada la comparación Ordinal. Esto significa que los caracteres se comparan byte a byte: 'A' (0x41) no es igual a 'a' (0x61). Para contenido en inglés, esto suele ser normal, pero en aplicaciones multilingües (ruso, alemán, turco), este enfoque rompe la lógica de búsqueda.

\n\n

Por ejemplo, en turco, la letra 'i' en mayúscula es 'İ', no 'I'. Un simple ToLower() puede dar un resultado incorrecto. Por lo tanto, simplemente llamar a text.ToLower().Contains(pattern.ToLower()) es una mala práctica. Veamos las soluciones modernas.

\n\n

Método 1: StringComparison.OrdinalIgnoreCase — su nuevo estándar

\n\n

A partir de .NET 5 (y funciona perfectamente en .NET 8/9), la forma más rápida y segura es usar la sobrecarga de Contains con el parámetro StringComparison:

\n\n
string text = "Guerra y paz — León Tolstói";\nstring searchTerm = "tolstói";\n\nbool result = text.Contains(searchTerm, StringComparison.OrdinalIgnoreCase);\nConsole.WriteLine(result); // True
\n\n

¿Por qué es la mejor opción?

\n
    \n
  • Velocidad: OrdinalIgnoreCase funciona a nivel de bytes, pero ignora las mayúsculas y minúsculas. Es de 2 a 3 veces más rápido que CurrentCultureIgnoreCase.
  • \n
  • Previsibilidad: No depende de la cultura del usuario. "ß" (Eszett alemán) no será igual a "ss" si no lo desea.
  • \n
  • Soporte: Disponible en todas las versiones modernas de .NET (Core 2.1+).
  • \n
\n\n

Use este método cuando necesite una comparación simple sin distinción de mayúsculas y minúsculas y no esté trabajando con características lingüísticas (ordenación, declinaciones).

\n\n

Método 2: IndexOf() con StringComparison — si necesita más control

\n\n

A veces no solo necesita verificar la presencia, sino también conocer la posición de la ocurrencia. O está trabajando con versiones anteriores de .NET Framework, donde Contains con StringComparison no está disponible. Entonces, IndexOf() viene al rescate:

\n\n
string text = "C# — el mejor lenguaje para backend";\nstring searchTerm = "mejor";\n\nbool result = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0;\nConsole.WriteLine(result); // True\n\n// Y si necesita obtener la posición:\nint index = text.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase);\nConsole.WriteLine(index); // 4 (posición donde comienza la palabra)
\n\n

Cuándo usarlo:

\n
    \n
  • En proyectos heredados (por ejemplo, .NET Framework 4.x).
  • \n
  • Cuando necesita encontrar el índice de la ocurrencia, no solo verificar su presencia.
  • \n
  • Para escenarios más complejos (por ejemplo, búsqueda omitiendo caracteres).
  • \n
\n\n

Importante: IndexOf devuelve -1 si la subcadena no se encuentra. Siempre verifique con >= 0, no con > 0.

\n\n

Método 3: CultureInfo.CurrentCultureIgnoreCase — para búsqueda lingüísticamente correcta

\n\n

Si su aplicación debe tener en

Blogs

Book Recommendations