Преобразование строки в сортируемое число

#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.