Это требование для любого сортировки сортировки для работы, что основной оператор порядка транзитивный и антисимметричный.
В .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)?
EDIT:
Здесь пример, где знак отрицателен в любом случае:
x = "\u4E00\u30A0"; // equiv: "一゠"
y = "\u4E00\u002D\u0041"; // equiv: "一-A"