.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
Confusión de la comparación: INVARIANTE vs. ORDINAL
... se agregó la noción de ordenación ordinal y se agregó un miembro ordinal a la enumeración CompareOptions. Si lo selecciona, ignorará todas esas características culturales de la recopilación y le dará una clasificación binaria que, por cierto, no variará.
comparación de cadenas InvariantCultureIgnoreCase vs OrdinalIgnoreCase?
C #: directrices de comparación de cadenas y uso común
La recomendación establece que para las comparaciones culturales-agnósticas use las comparaciones Ordinal y OrdinalIgnoreCase. Estos son rápidos y también seguros. Se basan en la concordancia de bytes y son excelentes opciones para emparejar cadenas para procesamiento interno (no de UI).
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
.