#c# #sorting
#c# #сортировка
Вопрос:
Есть ли какой-либо способ преобразования строкового значения (любого содержимого) в число таким образом, чтобы они оба сортировались одинаково? Мне не нужно иметь возможность преобразовывать число обратно в строку. На самом деле было бы преимуществом, если бы было невозможно преобразовать его обратно.
Мне не нужно иметь возможность сортировать строки любой длины. Если в качестве значения сортировки используется 64-разрядное целое число, я мог бы обрезать тексты до значения, соответствующего этому диапазону чисел.
Комментарии:
1. На самом деле это невозможно, если вы не установите определенные жесткие ограничения на то, какими могут быть эти строки, а затем создадите конвертер string-> long, который для любой строки, подчиняющейся этим ограничениям, создаст уникальный long . Без возможности определения таких ограничений преобразование строки в длину не даст уникальных длинных значений для любой строки. Почему бы и нет? Поскольку long — это всего лишь 8-байтовые (64-разрядные) данные, которые могут быть однозначно сопоставлены примерно с любой строкой ASCII / ANSI длиной до 8 или 9 символов (игнорируя непечатаемые символы …)
Ответ №1:
Я не думаю, что может быть 100% правильный способ, поскольку сортировка строки зависит от культуры. Например
int c1 = String.Compare("AA", "BB", false, CultureInfo.GetCultureInfo("en-US")); //return -1
int c2 = String.Compare("AA", "BB", false, CultureInfo.GetCultureInfo("da-DK")); //return 1
Самое близкое, о чем я могу думать, это:
ulong l = BitConverter.ToUInt64(Encoding.UTF8.GetBytes(str), 0);
PS: дополните str, если его длина короче 8
Комментарии:
1. Для соответствия порядковой сортировке строк вам придется вместо этого использовать беззнаковый long .
Ответ №2:
Вы могли бы взять первые 8 байтов из строки, 8 байтов составили бы длину. Это будет только 4 символа строки в юникоде или 8 символов, если вы ограничиваете строки ASCII.