Как работает OrderBy в отношении строк в С#?

Рассмотрим этот код

var strings2 = new List<string>
    {
        "0", // Ascii code 48 (decimal)
        "|"  // Ascii code 125 (decimal)
    };
var sorted = strings2.OrderBy(x => x).ToArray();

Сортировка содержит "|", "0". Теперь рассмотрим этот код (все, что я сделал, это изменить "|" на ".")

var strings2 = new List<string>
    {
        "0", // Ascii code 48 (decimal)
        "."  // Ascii code 46 (decimal)
    };
var sorted = strings2.OrderBy(x => x).ToArray();

Теперь отсортировано содержит ".", "0" В обоих случаях "0" приходит в конце, хотя 125 > 48, что здесь происходит?

Ответ 2

Здесь вы идете:

Сравнение использует текущую культуру для получения специфических для культуры информации, такой как правила обсадной колонны и алфавитный порядок индивидуальные символы. Например, культура может указать, что некоторые комбинации символов рассматриваются как один символ, или символы верхнего и нижнего регистра сравниваются определенным образом, или что порядок сортировки персонажа зависит от символов которые предшествуют или следуют за ним.

Источник: метод String.Compare в MSDN

Ответ 3

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

Список всех различных сопоставлений строк см. в статье MSDN.