c# - español - Qué versión de StringComparer usar
globalization and localization asp net core (7)
Dado que las claves son sus valores fijos conocidos, entonces InvariantCultureIgnoreCase o OrdinalIgnoreCase deberían funcionar. Evite la cultura específica, o podría golpear algunas de las cosas más "divertidas" como el problema "Turco i". Obviamente, usarías un comparador culta si estuvieras comparando valores cultados ... pero parece que no lo eres.
Si deseo tener un diccionario de clave de secuencia de mayúsculas y minúsculas insensible a mayúsculas y minúsculas, ¿qué versión de StringComparer debería usar teniendo en cuenta estas restricciones?
- Las claves en el diccionario provienen del código C # o de los archivos de configuración escritos solo en inglés (ya sea en los Estados Unidos o en el Reino Unido)
- El software está internacionalizado y se ejecutará en diferentes lugares
Normalmente uso StringComparer.InvariantCultureIgnoreCase, pero no estaba seguro de si ese es el caso correcto. Aquí hay un código de ejemplo:
Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);
El concepto de "insensible a mayúsculas y minúsculas" es lingüístico, por lo que no tiene sentido sin una cultura.
Vea este blog para más información.
Dicho esto, si solo estás hablando de cadenas usando el alfabeto latino, probablemente te salgas con InvariantCulture.
Sin embargo, probablemente sea mejor crear el diccionario con StringComparer.CurrentCulture. Esto le permitirá a "ß" unir "ss" en su diccionario bajo una cultura alemana, por ejemplo.
Hay tres tipos de comparadores:
- Conoce la cultura
- Invariante de la cultura
- Ordinal
Cada comparador tiene una versión sensible a mayúsculas y minúsculas .
Un comparador ordinal usa valores ordinales de caracteres. Este es el comparador más rápido, debe ser utilizado para fines internos.
Un comparador que tenga en cuenta la cultura considera los aspectos que son específicos de la cultura del hilo actual. Conoce los problemas "turco i", "español LL", etc. Se debe usar para cadenas de interfaz de usuario.
El comparador invariante de cultivo en realidad no está definido y puede producir resultados impredecibles, y por lo tanto, nunca debe usarse en absoluto.
Referencias
La Cultura Invariante existe específicamente para tratar cadenas que son internas del programa y que no tienen nada que ver con los datos del usuario o la IU. Parece que este es el caso para esta situación.
StringComparer.OrdinalIgnoreCase es ligeramente más rápido que InvariantCultureIgnoreCase FWIW ("Una comparación ordinal es rápida, pero insensible a la cultura" según MSDN .
Tendría que hacer muchas comparaciones para notar la diferencia, por supuesto.
System.Collections.Specialized incluye StringDictionary. La sección Comentarios de MSDN indica "Una clave no puede ser nula, pero sí un valor.
La clave se maneja de una manera que no distingue entre mayúsculas y minúsculas; se traduce a minúsculas antes de usarse con el diccionario de cadenas.
En .NET Framework versión 1.0, esta clase utiliza comparaciones de cadenas sensibles a la cultura. Sin embargo, en .NET Framework versión 1.1 y posterior, esta clase usa CultureInfo.InvariantCulture al comparar cadenas. Para obtener más información acerca de cómo el cultivo afecta las comparaciones y la clasificación, vea Comparación y clasificación de datos para una cultura específica y realización de operaciones de cadenas insensibles a la cultura.
Este artículo de MSDN cubre todo lo que pueda desear saber en gran profundidad, incluido el problema Turco-I.
Ha pasado un tiempo desde que lo leí, así que me voy a volver a hacerlo. ¡Te veo en una hora!