Что должны вернуть эти сравнения? - PullRequest
3 голосов
/ 05 ноября 2008

У меня есть приложение, которое использует string.compare (string, string) для сортировки некоторых значений. Я не могу понять, почему «1022» сравнивается как «10-23», а «10-23» сравнивается как «1024».

Есть ли что-то конкретное для значения "-", которое вызывает этот результат? Будет ли эта перегрузка string.compare давать один и тот же результат с разными настройками культуры для одного и того же типа данных (числа с тире)?

Ответы [ 2 ]

5 голосов
/ 05 ноября 2008

Из документации строка. Сравнение (строка, строка) :

Сравнение выполняется по правилам сортировки слов.

и далее :

.NET Framework использует три различных способа сортировки: сортировка слов, сортировка строк и порядковая сортировка. Сортировка слов выполняет сравнение строк с учетом культурных особенностей. Некоторым не буквенно-цифровым символам могут быть назначены специальные веса. Например, дефису («-») может быть присвоен очень маленький вес, так что «кооператив» и «кооператив» появляются рядом друг с другом в отсортированном списке. Сортировка строк похожа на сортировку слов, за исключением того, что особых случаев нет. Поэтому все не буквенно-цифровые символы располагаются перед всеми буквенно-цифровыми символами. Порядковая сортировка сравнивает строки на основе значений Unicode каждого элемента строки.

Некоторые подробности от Майкла Каплана здесь: A & P Sort Keys, часть 9 (он же не всегда переходный, но пунктуальный и пунктуальный) .

3 голосов
/ 05 ноября 2008

Ну, игнорировать тире довольно невинно. Если вы хотите включить их, возможно, используйте StringComparison.Ordinal в перегрузке.

Считая документы для string.Compare, он использует правила сортировки слов, которые из здесь означают:

Сортировка слов выполняет чувствительный к культуре сравнение строк. Определенный не буквенно-цифровые символы могут иметь им присвоены специальные веса. За Например, дефис ("-") может иметь очень маленький вес, назначенный ему так что «кооператив» и «кооператив» появляются рядом с друг друга в отсортированном списке.

По крайней мере, это транзитивно: я записал ошибку с «connect» о чем-то очень похожем, включая тире - где A и C

string s1 = "-0.67:-0.33:0.33";
string s2 = "0.67:-0.33:0.33";
string s3 = "-0.67:0.33:-0.33"; 
Console.WriteLine(s1.CompareTo(s2));
Console.WriteLine(s2.CompareTo(s3));
Console.WriteLine(s1.CompareTo(s3));

(возвращает 1,1, -1 на моей машине)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...