Вопрос

У меня есть приложение, которое использует 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 на моем компьютере)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top