Я подозреваю, что в последнем случае «-» обрабатывается по-другому из-за специфических для культуры настроек (возможно, как «тире», а не «минус» в первых строках). MSDN warns об этом:
Сравнения использует текущую культуру для получения культуры конкретной информации, таких как правила обсадных и алфавитный порядок отдельных символов. Например, культура может указывать, что определенные комбинации символов обрабатываются как один символ, или символы верхнего и нижнего регистра сравниваются определенным образом, или что порядок сортировки символа зависит от символов , которые предшествуют или следуйте за ним.
см Также в this MSDN page:
В .NET Framework использует три различных способа сортировки: слово сортировки, строка сортировки и порядкового сортировки. Сортировка Word выполняет сопоставимое с культурой сравнение строк. У некоторых неалфариновых символов могут быть назначены специальные весовые коэффициенты ; например, дефис («-») может иметь очень небольшой вес, назначенный ему, чтобы «курятник» и «кооператив» отображались рядом друг с другом в отсортированном списке. Строковая сортировка аналогична сортировке слов , за исключением того, что особых случаев нет; поэтому все знаки несимметричного символа присутствуют перед всеми буквенно-цифровыми символами. Обычная сортировка сравнивает строки на основе значений 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);
Спасибо Jared, Не могли бы вы рассказать мне, как я могу сортировать, если данные находятся в столбце DataTable 'DataTable dataTable = new DataTable(); dataTable.Columns.Add ("Item", typeof (string)); dataRow = dataTable.NewRow(); dataRow ["Item"] = "a-a"; dataTable.Rows.Add (dataRow); dataRow = dataTable.NewRow(); dataRow ["Item"] = "a.a"; dataTable.Rows.Add (dataRow); DataRow [] rows = dataTable.Select ("", "Item ASC"); ' – Satya