Ошибка сравнения строк .NET Framework
Это требование для любогосортировка сравнения работать, что основной оператор заказапереходный а такжеантисимметричен.
В .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"