Ответ 1
Это потому, что значение по умолчанию StringComparer
чувствительно к культуре. Насколько я могу судить, Comparer<string>.Default
делегирует string.CompareTo(string)
, который использует текущую культуру:
Этот метод выполняет сравнение слов (чувствительность к регистру и чувствительность к культуре) с использованием текущей культуры. Для получения дополнительной информации о словах, строках и порядковых сортировках см.
System.Globalization.CompareOptions
.
Затем страница CompareOptions
включает в себя:
В .NET Framework используются три разных способа сортировки: сортировка слов, сортировка строк и сортировка по порядку. Сортировка слов выполняет культурное сравнение строк. Определенные неасфальтированные символы могут иметь специальные веса, назначенные им. Например, дефис ( "-" ) может иметь очень небольшой вес, назначенный ему, чтобы "курятник" и "кооператив" отображались рядом друг с другом в отсортированном списке. Строковая сортировка похожа на сортировку слов, за исключением того, что особых случаев нет. Поэтому все неальфанумерные символы поступают перед всеми буквенно-цифровыми символами. Ordinal sort сравнивает строки, основанные на значениях Unicode для каждого элемента строки.
( "Малый вес" не совсем такой же, как "игнорируется", как указано в ответе Андрея, но эффекты здесь похожи.)
Если вы укажете StringComparer.Ordinal
, вы получите результаты:
66-0616280-00A
66-0616280-10A
66-0616280100A
66-0616280104A
Укажите его как второй аргумент OrderBy
:
s = s.OrderBy(t => t, StringComparer.Ordinal).ToList();
Здесь вы можете увидеть разницу:
Console.WriteLine(Comparer<string>.Default.Compare
("66-0616280104A", "66-0616280-10A"));
Console.WriteLine(StringComparer.Ordinal.Compare
("66-0616280104A", "66-0616280-10A"));