C'est une exigence pour toute comparaison sorte de travail que l'ordre sous-jacent de l'opérateur est transitive et antisymétrique.
Dans .NET, ce n'est pas vrai pour certaines chaînes:
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
}
Vous voyez qu' x
est strictement plus grand que y
, et y
est strictement plus grand que x
.
Parce qu' x.CompareTo(x)
et ainsi de suite tous les donner à zéro (0
), il est clair que ce n'est pas un ordre. Il n'est pas surprenant, j'obtiens des résultats imprévisibles quand j' Sort
des tableaux ou des listes contenant des chaînes de caractères comme x
et y
. Si je n'ai pas testé, j'en suis sûr, SortedDictionary<string, WhatEver>
ont des problèmes de maintien de soi dans l'ordre de tri et/ou de la localisation des éléments si des chaînes de caractères comme x
et y
sont utilisés pour les clés.
Est-ce un bug bien connu? Quelles sont les versions du framework sont touchés (j'essaye de faire avec .NET 4.0)?
EDIT:
Voici un exemple où le signe est négatif de la manière suivante:
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"