Неправильный порядок строк в 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