Bug na string comparando o .NET Framework
É um requisito para qualquertipo de comparação para trabalhar que o operador de ordem subjacente étransitivo eantissimétrico.
No .NET, isso não é verdade para algumas strings:
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
}
Você viu issox
é estritamente maior quey
ey
é estritamente maior quex
.
Porquex.CompareTo(x)
e assim por diante todos dão zero (0
), é claro que isso não é uma ordem. Não é de surpreender que eu tenha resultados imprevisíveis quandoSort
matrizes ou listas contendo strings comox
ey
. Embora eu não tenha testado isso, tenho certezaSortedDictionary<string, WhatEver>
terá problemas em manter-se em ordem de classificação e / ou localização de itens se strings comox
ey
são usados para chaves.
Esse bug é bem conhecido? Quais versões do framework são afetadas (estou tentando isso com o .NET 4.0)?
EDITAR:
Aqui está um exemplo em que o sinal é negativo de qualquer maneira:
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"