Error en la cadena de comparación de .NET Framework
Es un requisito para cualquiertipo de comparación para trabajar que el operador de orden subyacente estransitivo yantisimetrico.
En .NET, eso no es cierto para algunas cadenas:
static void CompareBug()
{
string x = "\u002D\u30A2"; // or just "-ア" if charset allows
string y = "\u3042"; // or just "あ" if charset allows
Console.WriteLine(x.CompareTo(y)); // positive one
Console.WriteLine(y.CompareTo(x)); // positive one
Console.WriteLine(StringComparer.InvariantCulture.Compare(x, y)); // positive one
Console.WriteLine(StringComparer.InvariantCulture.Compare(y, x)); // positive one
var ja = StringComparer.Create(new CultureInfo("ja-JP", false), false);
Console.WriteLine(ja.Compare(x, y)); // positive one
Console.WriteLine(ja.Compare(y, x)); // positive one
}
Ves quex
es estrictamente mayor quey
yy
es estrictamente mayor quex
.
Porquex.CompareTo(x)
y así en todos dan cero (0
), está claro que esto no es una orden. No es sorprendente que obtenga resultados impredecibles cuandoSort
matrices o listas que contienen cadenas comox
yy
. Aunque no he probado esto, estoy seguroSortedDictionary<string, WhatEver>
Tendrá problemas para mantenerse ordenado y / o para ubicar elementos si las cadenas comox
yy
Se utilizan para llaves.
¿Es este error conocido? ¿Qué versiones del marco están afectadas (estoy intentando esto con .NET 4.0)?
EDITAR:
Aquí hay un ejemplo donde el signo es negativo de cualquier manera:
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"