Я вижу очень странное поведение сортировки с использованием CaseInsensitiveComparer.DefaultInvariant. Слова, начинающиеся с начального дефиса "-", в конечном итоге сортируются так, как будто дефиса не было, а не перед фактическими буквами, что и происходит с другими пунктуациями.
Итак, учитывая {"hello", ".net", "-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>.
Есть идеи, что происходит?
Edit:
Похоже, по умолчанию .NET делает причудливые вещи при сортировке строк, что приводит к сортировке начальных дефисов в странных местах, так что кооператив и кооператив сортируются вместе. Таким образом, если вы хотите, чтобы ваши ведущие дефисные слова заканчивались и начинались с другой пунктуации, вы должны сказать не:
Array.Sort(rg, (a, b) => String.CompareOrdinal(a, b));