Я наблюдаю очень странное поведение сортировки с использованием CaseInsensitiveComparer.DefaultInvariant. Слова, начинающиеся с ведущего дефиса «-», в конечном итоге сортируются так, как будто дефиса там не было, а не перед фактическими буквами, как это происходит с другими знаками препинания.
Итак, учитывая {"привет", ". сеть" , "-less"} я получаю {".net", "hello", "-less"} вместо ожидаемых {"-less", ".net", "hello"}.
Или, сформулировано как тестовый пример:
[TestMethod]
public void TestMethod1()
{
var rg = new String[] {
"x", "z", "y", "-less", ".net", "- more", "a", "b"
};
Array.Sort(rg, CaseInsensitiveComparer.DefaultInvariant);
Assert.AreEqual(
"- more,-less,.net,a,b,x,y,z",
String.Join(",", rg)
);
}
... который не работает следующим образом:
Assert.AreEqual failed.
Expected:<- more,-less,.net,a,b,x,y,z>.
Actual: <- more,.net,a,b,-less,x,y,z>.
Есть идеи, что происходит?
Похоже, по умолчанию .NET делает необычные вещи при сортировке строк, что приводит к дефисы должны быть отсортированы в странные места, чтобы кооператив и кооператив сортировались вместе. Таким образом, если вы хотите, чтобы ваши первые дефисные слова заканчивались, а начало - другой пунктуацией, вы должны указать, чтобы это не было:
Array.Sort(rg, (a, b) => String.CompareOrdinal(a, b));