Si ejecuta la siguiente instrucción:¿Por qué string.Compare parece manejar caracteres acentuados de manera incoherente?
string.Compare("mun", "mün", true, CultureInfo.InvariantCulture)
El resultado es '-1', lo que indica que 'mun' tiene un valor numérico más bajo que 'Mun.
Sin embargo, si ejecuto esta declaración:
string.Compare("Muntelier, Schweiz", "München, Deutschland", true, CultureInfo.InvariantCulture)
recibo el mensaje '1', indicando que 'Muntelier, Schewiz' debe ir pasado.
¿Esto es un error en la comparación? O, más probablemente, es que hay una regla debería de tomar en cuenta al ordenar cadenas que contienen acentuado
La razón de que esto es un problema es que estoy ordenar una lista y luego hacer un filtro binario manual que ha significado para obtener cada cadena que comienza con 'xxx'.
Anteriormente estaba usando el método Linq 'Where', pero ahora tengo que usar esta función personalizada escrita por otra persona, porque dice que tiene un mejor rendimiento.
Pero la función personalizada no parece tener en cuenta las reglas 'Unicode' que tiene .NET. Entonces, si le digo que filtre por 'mün', no encuentra ningún elemento, aunque hay elementos en la lista que comienzan con 'mun'.
Esto parece deberse al ordenamiento incoherente de los caracteres acentuados, dependiendo de qué caracteres vayan después del carácter acentuado.
Bien, creo que he solucionado el problema.
antes del filtro, hago una especie en base a los primeros n cartas de cada cadena, donde n es la longitud de la cadena de búsqueda.
Es momentos como este que me gustaría que el .NET Framework era de código abierto, así que podría pasar al modo de depuración y descubrir exactamente qué está haciendo. – Jonathan
@jonathanconway: Es posible recorrer el código fuente de la biblioteca de la clase base, ver http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net- framework-source-code.aspx –
@divo Gracias por la referencia. ¡Nunca me di cuenta que esto era posible! – Jonathan