基になる順序演算子が推移的で反対称であることは、比較並べ替えが機能するための要件です。
.NET では、一部の文字列には当てはまりません。
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
}
は厳密には よりも大きく、厳密x
には よりも大きいことがわかります。y
y
x
x.CompareTo(x)
などはすべてゼロ ( ) を与えるため0
、これが注文ではないことは明らかです。当然のことながら、 や のような文字列を含む配列またはリストを作成すると、予測できない結果が得られSort
ます。私はこれをテストしていませんが、キーにやのような文字列が使用されている場合、ソートされた順序でそれ自体を維持したり、アイテムを見つけたりするのに問題があると確信しています。x
y
SortedDictionary<string, WhatEver>
x
y
このバグは有名ですか?どのバージョンのフレームワークが影響を受けますか (.NET 4.0 で試しています)?
編集:
次の例では、どちらの場合でも符号が負になります。
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"