Я подозреваю, что в последнем случае «-» обрабатывается по-другому из-за специфических для культуры настроек (возможно, как «тире», а не «минус» в первых строках). MSDN предупреждает об этом:
Сравнение использует текущую культуру для получения конкретной культуры
информация, такая как правила кожуха и алфавитный порядок
отдельные персонажи. Например, культура может указать, что
определенные комбинации символов должны рассматриваться как один символ,
или прописные и строчные буквы сравниваются определенным образом,
или что порядок сортировки символа зависит от символов
которые предшествуют или следуют за ним.
Также см. В эту страницу MSDN :
.NET Framework использует три различных способа сортировки: сортировка слов,
сортировка строк и порядковая сортировка. Сортировка слов выполняет чувствительный к культуре
сравнение строк. Некоторые не буквенно-цифровые символы могут иметь
им присвоены специальные веса; например, дефис ("-") может
иметь очень маленький вес, назначенный ему так, чтобы "кооператив" и "кооператив"
появляются рядом друг с другом в отсортированном списке. Сортировка строк похожа на
сортировка слов, за исключением того, что особых случаев нет; поэтому все
не буквенно-цифровые символы располагаются перед всеми буквенно-цифровыми символами.
Порядковая сортировка сравнивает строки на основе значений Unicode каждого
элемент строки.
Итак, дефис получает специальную обработку в режиме сортировки по умолчанию, чтобы сделать сортировку слов более «естественной».
Вы можете получить "нормальную" порядковую сортировку, если специально ее включите:
Console.WriteLine(string.Compare("a.", "a-")); //1
Console.WriteLine(string.Compare("a.a", "a-a")); //-1
Console.WriteLine(string.Compare("a.", "a-", StringComparison.Ordinal)); //1
Console.WriteLine(string.Compare("a.a", "a-a", StringComparison.Ordinal)); //1
Для сортировки исходной коллекции с использованием порядкового сравнения используйте:
items.Sort(StringComparer.Ordinal);