2011-01-12 17 views
19

De sus breves descripciones de resumen, parece que las reglas de comparación de cadenas StringComparison.Ordinal y StringComparison.InvariantCulture están destinadas a diferir en cómo lo hacen ordenando de cadenas. Es ese todos? es decir, ¿eso significa que podemos usar cualquiera de las reglas de comparación de cadenas al hacer una comparación de igualdad?es StringComparison.Ordinal lo mismo que InvariantCulture para probar la igualdad?

string.Equals(a, b, StringComparison....) 

Y para el crédito adicional: ¿habría alguna diferencia en la respuesta si comparamos OrdinalIgnoreCase y InvariantCultureIgnoreCase? ¿Cómo?

Proporcione el argumento de apoyo y/o referencias.

+2

La cultura es importante para las comparaciones de invariantes de mayúsculas y minúsculas, ya que algunos idiomas tienen reglas extrañas de mayúsculas/minúsculas. Por ejemplo, turco con sus dos "i" mayúsculas y dos minúsculas, que se cruzan. – CodesInChaos

Respuesta

19

sí importa, por ejemplo - no es una cosa que se llama expansión carácter

var s1 = "Strasse"; 
    var s2 = "Straße"; 

    s1.Equals(s2, StringComparison.Ordinal);   // false 
    s1.Equals(s2, StringComparison.InvariantCulture); // true 

Con InvariantCulture el carácter ß se expandió a ss.

+0

Sí, pero la pregunta era sobre InvariantCulture, no CurrentCulture. –

+0

@ TimLovell-Smith - solucionado mi ejemplo - sigue siendo válido – Bond

+1

¡Guau, gracias por una gran y reveladora respuesta! Tuve que probar tu muestra, también probé qué sucede si IgnoreCase está activado. IgnoreCase no hace diferencia para este ejemplo. –

5

Bueno, ciertamente importa. Cuando utiliza una comparación de igualdad de "ignorar caso", está invocando una porción bastante masiva de código en el marco de .NET que es consciente de cómo funcionan las reglas de mayúsculas y minúsculas en la cultura actual. Las reglas de las cuales son muy interesantes para un geek de coleccionista de sellos antiguos como yo, hay algunas reglas bastante raras dependiendo de dónde mires. El problema turco I es famoso, los tipos Unicode tuvieron que hacer una excepción explícita para ellos.

No es realmente código por cierto, es tablas de búsqueda. Interesante en sí mismo porque requiere que MSFT mantenga la opción de línea de comando/linkres para el compilador de C#. Una opción de compilación que no puedes usar en tus propios proyectos. Está únicamente allí para que mscorlib pueda encontrar los archivos .nlp, las tablas de conversión para reglas de cultivo. Almacenado en el mismo subdirectorio del GAC como mscorlib.dll, el efecto de la opción de compilación.

Pero estoy divagando. Es lógico que StringComparison.OrdinalIgnoreCase sea un poquito más rápido que StringComparison.InvariantCultureIgnoresCase. El hecho de que "invariante" signifique EE. UU., Hogar de MSFT. Difícil de medir, este reloj en nanosegundos. StringComparison.CurrentCultureIgnoreCase golpea esas tablas de traducción. Muerto lento cuando lo usas por primera vez, solo más lento cuando lo usas más tarde. se añadió

+1

+1 ¡Interesante! –

4

Para la pregunta crédito adicional

Cuestiones relacionadas