¿Cuál es generalmente mejor usar: StringComparison.OrdinalIgnoreCase o StringComparison.InvariantCultureIgnoreCase?

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un código como este:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

No me importa el caso.¿Debería usar OrdinalIgnoreCase, InvariantCultureIgnoreCase, o CurrentCultureIgnoreCase?

¿Fue útil?

Solución

Los documentos .Net más nuevos ahora tienen una tabla para ayudarlo a decidir cuál es mejor usar en su situación.

De MSDN "Nuevas recomendaciones para el uso de cadenas en Microsoft .NET 2.0"

Resumen:Propietarios de códigos que anteriormente utilizaban el InvariantCulture para comparar cadenas, envolver y clasificar deberían considerar seriamente el uso de un nuevo conjunto de String sobrecargas en Microsoft .NET 2.0. Específicamente, los datos que están diseñados para ser independientes de la cultura y lingüísticamente irrelevantes debería comenzar a especificar sobrecargas utilizando el StringComparison.Ordinal o StringComparison.OrdinalIgnoreCase miembros del nuevo StringComparison enumeración.Estos imponen una comparación byte por byte similar a strcmp eso no sólo evita errores de interpretación lingüística de cadenas esencialmente simbólicas, sino que también proporciona un mejor rendimiento.

Otros consejos

Todo depende

Comparar cadenas Unicode es difícil:

La implementación de búsquedas y comparaciones de cadena Unicode en el software de procesamiento de texto debe tener en cuenta la presencia de puntos de código equivalentes.En ausencia de esta característica, los usuarios que buscan una secuencia de punto de código particular no podrían encontrar otros glifos visualmente indistinguibles que tengan una representación de punto de código diferente, pero canónicamente equivalente.

ver: http://en.wikipedia.org/wiki/Unicode_equivalence


Si está intentando comparar 2 cadenas Unicode sin distinguir entre mayúsculas y minúsculas y desea que funcione EN TODOS LADOS, tienes un problema imposible.

El ejemplo clásico es el turco yo, que cuando está en mayúsculas se convierte en İ (observe el punto)

De forma predeterminada, el marco .Net suele utilizar el Cultura actual para funciones relacionadas con cadenas, con una excepción muy importante de .Equals que utiliza una comparación ordinal (byte a byte).

Esto lleva, por diseño, a que las diversas funciones de cadena se comporten de manera diferente dependiendo de la cultura de la computadora.


Sin embargo, a veces queremos una comparación de "propósito general", que no distinga entre mayúsculas y minúsculas.

Por ejemplo, es posible que desee que su comparación de cadenas se comporte de la misma manera, sin importar en qué computadora esté instalada su aplicación.

Para conseguirlo tenemos 3 opciones:

  1. Establezca la cultura explícitamente y realice una comparación que no distinga entre mayúsculas y minúsculas utilizando reglas de equivalencia Unicode.
  2. Establezca la cultura en Cultura invariante y realice una comparación que no distinga entre mayúsculas y minúsculas utilizando reglas de equivalencia Unicode.
  3. Usar OrdinalIgnorarCaso que pondrá en mayúsculas la cadena usando InvariantCulture y luego realizará una comparación byte por byte.

Las reglas de equivalencia Unicode son complicadas, lo que significa que usar el método 1) o 2) es más costoso que OrdinalIgnoreCase.El hecho de que OrdinalIgnoreCase no realiza ninguna normalización Unicode especial, lo que significa que algunas cadenas se representan de la misma manera en la pantalla de una computadora, no lo hará considerarse idénticos.Por ejemplo: "\u0061\u030a" y "\u00e5" ambos representan å.Sin embargo, en una comparación ordinal se considerará diferente.

Lo que elija depende en gran medida de la aplicación que esté creando.

  • Si estuviera escribiendo una aplicación de línea de negocio que solo fuera utilizada por usuarios turcos, me aseguraría de usar el método 1.
  • Si solo necesitara una simple comparación "falsa" que no distinga entre mayúsculas y minúsculas, por ejemplo, un nombre de columna en una base de datos, que generalmente está en inglés, probablemente usaría el método 3.

Microsoft tiene su conjunto de recomendaciones con pautas explícitas.Sin embargo, es realmente importante comprender la noción de equivalencia Unicode antes de abordar estos problemas.

Además, tenga en cuenta que OrdinalIgnoreCase es un tipo muy especial de bestia, es decir, escoger y elegir un poco ordinal en comparación con algunos aspectos lexicográficos mixtos.Esto puede resultar confuso.

MSDN hace algunas recomendaciones bastante claras sobre esto: http://msdn.microsoft.com/en-us/library/ms973919.aspx

Supongo que depende de tu situación.Dado que las comparaciones ordinales en realidad analizan los valores numéricos Unicode de los caracteres, no serán la mejor opción al ordenar alfabéticamente.Sin embargo, para comparaciones de cadenas, el ordinal sería un poco más rápido.

Depende de lo que quieras, aunque yo evitaría la cultura invariante a menos que seas muy Seguro que nunca querrás localizar el código para otros idiomas.Utilice CurrentCulture en su lugar.

Además, OrdinalIgnoreCase debe respetar los números, que pueden ser o no los que usted desea.

La respuesta muy simple es que, a menos que estés usando turco, no necesitas usar InvariantCulture.

Vea el siguiente enlace:

En C# ¿cuál es la diferencia entre ToUpper() y ToUpperInvariant()?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top