.net string equality string-comparison culture

.net - ¿Es StringComparison.Ordinal lo mismo que InvariantCulture para probar la igualdad?



equality string-comparison (3)

Bueno, ciertamente importa. Cuando utiliza una comparación de igualdad de "caso de ignorar", entonces está invocando una parte bastante masiva de código en el marco .NET que es consciente de cómo funcionan las reglas de revestimiento en la cultura actual. Las reglas que son muy interesantes para un ex geek de coleccionistas de sellos como yo, hay algunas reglas bastante extrañas en función de dónde se mire. El problema del turco I es famoso, los tipos de Unicode tuvieron que hacer una excepción explícita para ellos.

En realidad no es código por cierto, son 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. Solo existe para que mscorlib pueda encontrar los archivos .nlp, las tablas de conversión para las reglas de cultura. Almacenado en el mismo subdirectorio de la GAC ​​como mscorlib.dll, el efecto de la opción de compilación.

Pero yo divago. Es lógico que StringComparison.OrdinalIgnoreCase sea ​​un poquito más rápido que StringComparison.InvariantCultureIgnoreCase. Solo porque "invariante" significa Estados Unidos, hogar de MSFT. Difícil de medir, esto marca en nanosegundos. StringComparison.CurrentCultureIgnoreCase golpea esas tablas de traducción. Muerto lento cuando lo usa por primera vez, solo más lento cuando lo usa más tarde.

A partir de sus breves descripciones resumidas, parece que las reglas de comparación de cadenas StringComparison.Ordinal y StringComparison.InvariantCulture tienen la intención de diferir en la forma en que clasifican las cadenas. ¿Eso es todo ? es decir, ¿significa eso que podemos usar cualquiera de las dos reglas de comparación de cadenas cuando hacemos una comparación de igualdad?

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

Y para obtener crédito adicional: ¿hace una diferencia en la respuesta si comparamos OrdinalIgnoreCase e InvariantCultureIgnoreCase ? ¿Cómo?

Por favor proporcione argumentos y / o referencias de apoyo.


Para la pregunta de crédito extra


Sí importa, por ejemplo, hay una cosa llamada expansión de caracteres.

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 expande a ss .