Почему «-less» выполняет сортировку после «привет», а не перед ним?

Я наблюдаю очень странное поведение сортировки с использованием 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));
6
задан Aaron Maenpaa 9 September 2010 в 21:27
поделиться