Что должны вернуть эти сравнения?
-
06-07-2019 - |
Вопрос
У меня есть приложение, которое использует string.compare (string, string) для сортировки некоторых значений. Я не могу понять, почему & Quot; 1022 & Quot; сравнивается как меньше чем " 10-23 " и " 10-23 " сравнивается как <<> quot; 1024 ".
Есть ли что-то конкретное для значения " - " что вызывает этот результат? Будет ли эта перегрузка string.compare давать один и тот же результат с разными настройками культуры для одного и того же типа данных (числа с тире)?
Решение
Из документации string.Compare (String, String) :
Сравнение выполняется с использованием правил сортировки слов.
и далее :
.NET Framework использует три различных способа сортировки: сортировка слов, сортировка строк и порядковая сортировка. Сортировка слов выполняет сравнение строк с учетом культурных особенностей. Некоторым не буквенно-цифровым символам могут быть назначены специальные веса. Например, дефису (& Quot; - & Quot;) может быть присвоен очень маленький вес, так что & Quot; coop & Quot; и " кооператив " появляются рядом друг с другом в отсортированном списке. Сортировка строк похожа на сортировку слов, за исключением того, что особых случаев нет. Поэтому все не буквенно-цифровые символы располагаются перед всеми буквенно-цифровыми символами. Порядковая сортировка сравнивает строки на основе значений Unicode каждого элемента строки.
Еще несколько подробностей от Майкла Каплана здесь: A & amp; P из Sort Keys, часть 9 (иначе не всегда переходный, но пунктуальный и пунктуальный) .
Другие советы
Ну, игнорировать тире довольно невинно. Если вы хотите включить их, возможно, используйте StringComparison.Ordinal
в перегрузке.
Читая документы для string.Compare
, он использует слово правила сортировки, которые с здесь означают:
Сортировка слов выполняется с учетом культурных особенностей. сравнение строк. Определенный не буквенно-цифровые символы могут иметь им присвоены специальные веса. За Например, дефис (" - ") может иметь очень маленький вес, назначенный ему так это & "курятник!" и " кооператив " появляются рядом с друг друга в отсортированном списке.
По крайней мере, это транзитивно: я зарегистрировал ошибку с помощью " connect " о чем-то очень похожем с использованием тире - где A < B, B & Lt; C и C & Lt; A. Поскольку нетранзитивное сравнение существенно нарушает правила сортировки. Было закрыто & Quot; не исправить & Quot ;. Вот оно:
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 на моем компьютере)