Dependiendo de la cultura actual, ToLower podría producir una letra minúscula específica de la cultura, que no está esperando. Como producir ınfosin el punto en la i en lugar deinfo y, por lo tanto, acumular comparaciones de cadenas. Por esa razón, ToLowerInvariant debe usarse en cualquier dato no específico del idioma. Cuando podría tener una entrada del usuario que podría estar en su idioma nativo / juego de caracteres, generalmente sería la única vez que use ToLower.
Si su aplicación depende del caso de una cadena que cambia de una manera predecible que no se ve afectada por la cultura actual, use el método ToLowerInvariant. El método ToLowerInvariant es equivalente a ToLower (CultureInfo.InvariantCulture). El método se recomienda cuando una colección de cadenas debe aparecer en un orden predecible en un control de interfaz de usuario.
además
... ToLower es muy similar en la mayoría de los lugares a ToLowerInvariant. Los documentos indican que estos métodos solo cambiarán el comportamiento con las culturas turcas. Además, en los sistemas Windows, el sistema de archivos no distingue entre mayúsculas y minúsculas, lo que limita aún más su uso ...
No, no lo es. "Ordinal" es una tercera opción, una forma ligeramente diferente de "ignorar" la cultura actual. La distinción no es relevante al discutir ToLowervariantes; Ordinal vs. invariante simplemente cambia el "orden de clasificación" de dos cadenas, no cambia la comparación de igualdad.
ToolmakerSteve
27
TL; DR:
Cuando trabaje con "contenido" (por ejemplo, artículos, publicaciones, comentarios, nombres, lugares, etc.) use ToLower(). Cuando trabaje con "literales" (por ejemplo, argumentos de línea de comando, gramáticas personalizadas, cadenas que deberían ser enumeraciones, etc.) use ToLowerInvariant().
Ejemplos:
= Uso ToLowerInvariantincorrecto =
En turco, DIŞsignifica "afuera" y dişsignifica "diente". La carcasa inferior adecuada de DIŞes dış. Entonces, si usa ToLowerInvariantincorrectamente, puede tener errores tipográficos en Turquía.
= Uso ToLowerincorrecto =
Ahora imagina que estás escribiendo un analizador SQL. En algún lugar tendrá un código similar al siguiente:
if(operator.ToLower()=="like"){// Handle an SQL LIKE operator}
La gramática SQL no cambia cuando cambia de cultura. Un francés no escribe en SÉLECTIONNEZ x DE bookslugar de SELECT X FROM books. Sin embargo, para que el código anterior funcione, una persona turca necesitaría escribir SELECT x FROM books WHERE Author LİKE '%Adams%'(tenga en cuenta el punto sobre la capital i, casi imposible de ver). Esto sería bastante frustrante para su usuario turco.
Respuestas:
Dependiendo de la cultura actual, ToLower podría producir una letra minúscula específica de la cultura, que no está esperando. Como producir
ınfo
sin el punto en la i en lugar deinfo
y, por lo tanto, acumular comparaciones de cadenas. Por esa razón, ToLowerInvariant debe usarse en cualquier dato no específico del idioma. Cuando podría tener una entrada del usuario que podría estar en su idioma nativo / juego de caracteres, generalmente sería la única vez que use ToLower.Consulte esta pregunta para ver un ejemplo de este problema: C # - ToLower () a veces elimina el punto de la letra "I"
fuente
Creo que esto puede ser útil:
http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx
actualizar
además
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
hth
fuente
String.ToLower()
usa la cultura predeterminada mientrasString.ToLowerInvariant()
usa la cultura invariante. Por lo tanto, esencialmente pregunta las diferencias entre la cultura invariante y la comparación de cadenas ordinales .fuente
ToLower
variantes; Ordinal vs. invariante simplemente cambia el "orden de clasificación" de dos cadenas, no cambia la comparación de igualdad.TL; DR:
Cuando trabaje con "contenido" (por ejemplo, artículos, publicaciones, comentarios, nombres, lugares, etc.) use
ToLower()
. Cuando trabaje con "literales" (por ejemplo, argumentos de línea de comando, gramáticas personalizadas, cadenas que deberían ser enumeraciones, etc.) useToLowerInvariant()
.Ejemplos:
= Uso
ToLowerInvariant
incorrecto =En turco,
DIŞ
significa "afuera" ydiş
significa "diente". La carcasa inferior adecuada deDIŞ
esdış
. Entonces, si usaToLowerInvariant
incorrectamente, puede tener errores tipográficos en Turquía.= Uso
ToLower
incorrecto =Ahora imagina que estás escribiendo un analizador SQL. En algún lugar tendrá un código similar al siguiente:
La gramática SQL no cambia cuando cambia de cultura. Un francés no escribe en
SÉLECTIONNEZ x DE books
lugar deSELECT X FROM books
. Sin embargo, para que el código anterior funcione, una persona turca necesitaría escribirSELECT x FROM books WHERE Author LİKE '%Adams%'
(tenga en cuenta el punto sobre la capital i, casi imposible de ver). Esto sería bastante frustrante para su usuario turco.fuente