2008-10-09 7 views
19

Si yo quiero tener un diccionario cadena de la carrocería entre mayúsculas y minúsculas, la versión de StringComparer debo usar Dadas estas restricciones:qué versión de StringComparer utilizar

  • las llaves en el diccionario venir de cualquier código C# o archivos de configuración escritos en la configuración regional Inglés solamente (ya sea de Estados Unidos o Reino Unido)
  • el software está internacionalizado y se ejecutará en diferentes lugares

normalmente uso StringComparer.InvariantCultureIgnoreCase pero no estaba seguro si esa es la correcta caso. Aquí es código de ejemplo:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase); 

Respuesta

11

This MSDN article cubre todo lo que pueda desear saber en gran profundidad, incluyendo 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!

1

Dado que las claves son sus valores fijos conocidos, entonces o bien InvariantCultureIgnoreCase o OrdinalIgnoreCase deben trabajar. 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.

3

El concepto de "sin distinción de mayúsculas y minúsculas" es uno de tipo lingüístico, por lo que no tiene sentido sin una cultura.

Consulte este blog para obtener más información.

Dicho esto, si solo estás hablando de cadenas usando el alfabeto latino, probablemente te salgas con la 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.

1

StringComparer.OrdinalIgnoreCase es ligeramente más rápido que InvariantCultureIgnoreCase Fwiw ("Una comparación ordinal es rápido, pero la cultura no sensible", según MSDN.

que tendría que estar haciendo un montón de comparaciones a notar la diferencia de por supuesto.

0

la referencia cultural invariable existe específicamente para hacer frente a las cadenas que son internos al programa y no tienen nada que ver con los datos del usuario o la interfaz de usuario. parece que este es el caso de esta situación.

27

hay tres tipos de comparadores:

  • Cultura-consciente
  • Cultura invariante
  • ordinal

Cada comparador tiene un, así como una versión mayúsculas y minúsculas -caso insensible.

Un ordinal comparer utiliza valores ordinales de los caracteres. Este es el comparador más rápido, debe ser utilizado para fines internos.

A culture-aware comparer 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.

invariante de cultura comparer no está definido y puede producir resultados impredecibles, por lo que nunca debe utilizarse.

Referencias

  1. New Recommendations for Using Strings in Microsoft .NET 2.0
+0

que fue agradable y dulce. Un caso en el que prefiero la cultura invariable es cuando mirando en db .. – nawfal

0

System.Collections.Specialized incluye StringDictionary. La sección Notas de la MSDN indica "Una clave no puede ser nulo, pero un valor lata

La clave es manejado de una manera sensible a las mayúsculas;. Se traduce en minúsculas antes de que se utiliza con el diccionario cadena

.

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 la cultura afecta las comparaciones y la clasificación, ver Comparación y clasificación de datos para una cultura específica y Operaciones de cadenas insensibles a la cultura.