string.ToLower () y string.ToLowerInvariant ()

Respuestas:

148

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.

Consulte esta pregunta para ver un ejemplo de este problema: C # - ToLower () a veces elimina el punto de la letra "I"

AaronLS
fuente
45

Creo que esto puede ser útil:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

actualizar

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 ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth

danyolgiax
fuente
@danyolgiax ¿Puedes dar más detalles? no puede inferir su usabilidad desde el enlace de msdn. Gracias
Prerak K
2
sí ToLowerInvariant no funciona en turco como se esperaba. © se convierte en
MonsterMMORPG
28

String.ToLower()usa la cultura predeterminada mientras String.ToLowerInvariant()usa la cultura invariante. Por lo tanto, esencialmente pregunta las diferencias entre la cultura invariante y la comparación de cadenas ordinales .

Cheng Chen
fuente
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.

Paso
fuente