Неправильный порядок строк в C#

Я запустил это:

void Main()
{
    List<string> strings = new List<string>{"aaa", "z", "a"};
    Console.WriteLine(string.Join("\n", strings.OrderBy(k => k)));
}

И вывод:

a
z
aaa

Это не может быть правдой! я ожидал

a
aaa
z

В чем может быть проблема?

2 ответа

Я понял, что OrderBy использует текущую локаль для сортировки строк. В моем случае локаль датская, в которой "аа" следует после "z", поскольку представляет букву "å", которая добавляется в конце алфавита.

Это стало для меня неожиданностью, потому что я ожидал сортировки по-английски, и я не понимал, что локаль была все время датской; многие другие параметры в моей системе настроены на английский, включая язык. Это обмануло мои ожидания, что они ошиблись.

Чтобы получить заказ, который я ожидаю, достаточно было пройти StringComparer.InvariantCulture в OrderBy:

void Main()
{
    List<string> strings = new List<string>{"aaa", "z", "a"};
    Console.WriteLine(string.Join("\n", strings.OrderBy(k => k, StringComparer.InvariantCulture)));
}

Выход:

a
aaa
z

Это происходит потому, что ваш компаратор по умолчанию сначала сортирует по длине. Вы не пытались отсортировать коллекцию в смешанных случаях, например:

List<string> strings = new List<string>{"aaa", "D", "z", "a"};

В ответе, опубликованном elnigno, он выдаст такой результат:

a
aaa
D
z

Если вам нужно, чтобы они были упорядочены по их кодам в таблице кодирования, то, скорее всего, вы предпочтете этот способ:

var keywords = new List<string> { "aaa", "D", "z", "a" };
Console.WriteLine(string.Join("\n", keywords.OrderBy(k => k, StringComparer.Ordinal)));

И вывод будет такой:

D
a
aaa
z
Другие вопросы по тегам