Tengo un código como este:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
No me importa el caso. ¿Debo usar OrdinalIgnoreCase
, InvariantCultureIgnoreCase
o CurrentCultureIgnoreCase
?
.net
vb.net
localization
Dave Haynes
fuente
fuente
Respuestas:
Los documentos .Net más nuevos ahora tienen una tabla para ayudarlo a decidir cuál es el mejor para usar en su situación.
De " Nuevas recomendaciones de MSDN para usar cadenas en Microsoft .NET 2.0 "
fuente
"Straße"
y"STRASSE"
. Al usarOrdinalIgnoreCase
losEquals
retornosfalse
, mientras queInvariantCultureIgnoreCase
dice que son iguales.Todo depende
Comparar cadenas unicode es difícil:
ver: http://en.wikipedia.org/wiki/Unicode_equivalence
Si está tratando de comparar 2 cadenas unicode sin distinción entre mayúsculas y minúsculas y quiere que funcione EN TODAS PARTES , tiene un problema imposible.
El ejemplo clásico es el i turco , que cuando está en mayúscula se convierte en İ (observe el punto)
Por defecto, el marco .Net generalmente usa CurrentCulture para funciones relacionadas con cadenas, con una excepción muy importante
.Equals
que usa una comparación ordinal (byte por byte).Esto lleva, por diseño, a las diversas funciones de cadena que se comportan de manera diferente según la cultura de la computadora.
Sin embargo, a veces queremos un "propósito general", sin distinción entre mayúsculas y minúsculas, comparación.
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 lograr esto tenemos 3 opciones:
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 queOrdinalIgnoreCase
no realice ninguna normalización Unicode especial significa que algunas cadenas que se procesan de la misma manera en la pantalla de una computadora no se considerarán idénticas. Por ejemplo:"\u0061\u030a"
y"\u00e5"
ambos representan å. Sin embargo, en una comparación ordinal se considerará diferente.El que elija depende en gran medida de la aplicación que esté creando.
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 de bestia muy especial , que consiste en elegir un poco de un ordinal en comparación con algunos aspectos lexicográficos mixtos. Esto puede ser confuso.
fuente
Supongo que depende de tu situación. Dado que las comparaciones ordinales en realidad están mirando los valores numéricos de Unicode de los caracteres, no serán la mejor opción cuando esté ordenando alfabéticamente. Sin embargo, para las comparaciones de cadenas, el ordinal sería un poco más rápido.
fuente
Depende de lo que quieras, aunque me alejaría de la cultura invariable a menos que estés muy seguro de 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 o no ser lo que desea.
fuente
La respuesta muy simple es que, a menos que esté usando turco, no necesita usar InvariantCulture.
Ver el siguiente enlace:
En C #, ¿cuál es la diferencia entre ToUpper () y ToUpperInvariant ()?
fuente