Fehler beim Stringvergleich von .NET Framework
Es ist eine Voraussetzung für jedenVergleich sortieren zu arbeiten, dass der zugrunde liegende Auftragsbetreiber isttransitiv undantisymmetrisch.
In .NET gilt dies nicht für einige Zeichenfolgen:
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
}
Siehst du dasx
ist streng größer alsy
, undy
ist streng größer alsx
.
weilx.CompareTo(x)
und so weiter alle geben Null (0
) ist klar, dass dies keine Bestellung ist. Es überrascht nicht, dass ich unvorhersehbare Ergebnisse erhalte, wenn ichSort
Arrays oder Listen mit Strings wiex
undy
. Obwohl ich das noch nicht getestet habe, bin ich mir sicherSortedDictionary<string, WhatEver>
wird Probleme haben, sich in sortierter Reihenfolge zu halten und / oder Gegenstände zu finden, wenn Strings wiex
undy
werden für Schlüssel verwendet.
Ist dieser Fehler bekannt? Welche Versionen des Frameworks sind betroffen (ich versuche dies mit .NET 4.0)?
BEARBEITEN:
Hier ist ein Beispiel, bei dem das Vorzeichen in beiden Fällen negativ ist:
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"