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 queyey é 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"

questionAnswers(2)

yourAnswerToTheQuestion