2016-11-11 2 views
0

У меня есть список, содержащий данные со строкой и числом. Я должен заказать его в порядке возрастания и убывания.C# orderby string вместе с int

 id data 
    ------------------ 
     1  [email protected]% 
     2  data10 
     3  data 
     4  @$data 
     5  data2 

Я беру запись и храните ее в списке «Список». Затем я заказываю его по возрастанию, но «data10» идет в ч/б «data1» и «data2». Ниже мой код

var o/p = List.OrderBy(x => x.data); 

expected output - data1, data2 and data10 
+0

заказать его по идентификатору вместо – active92

+0

Да, это словарь упорядоченность. – Rahul

+0

Я предполагаю, что ваш код фактически не включает в себя 'var o/p = ...' – Abion47

ответ

0

Чтобы получить то, что вы хотите, вы должны раздуть числовую часть в вашем заказе по статье, что-то вроде:

var o/p = List.OrderBy(x => PadNumbers(x.Data)); 

где PadNumbers может быть определен как пользователь StackOverflow Nathan имеет написано here:

public static string PadNumbers(string input) 
{ 
    return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0')); 
} 

Это подушечки нулей для любого числа (или номер), которые появляются во входной строке, так что OrderBy видит:

data0000000001 
data0000000010 
data0000000002 

Прокладка выполняется только на ключ, используемый для сравнения. Исходные строки (без заполнения) сохраняются в результате.

Примечание: Этот подход предполагает максимальное количество цифр для чисел на входе.

+0

может уяснить приведенный выше код fn – anand

+0

Решение для заполнения просто переместите проблему и не удалите ее. Преобразование числа в целое число будет работать в любом случае. Нет необходимости отмечать максимальное количество цифр. – Fabio

+0

Пожалуйста, не принимайте другое решение пользователя и представляйте его как свое. – Rawling

1

Вы в настоящее время сортируете его на основе строковых значений, которые сортируют его по значению словаря. В словаре «10» появится между «1» и «2», потому что это алфавитный порядок - он не признает, что он сортирует числа.

Истинная буквенно-цифровая сортировка может быть довольно сложной, но на основе ваших данных вы можете ее упростить. Если предположить, что строка «data1», «data2», и «data10» является закономерность, вы можете сделать что-то вроде этого:

var op = List.OrderBy(x => int.Parse(x.data.substring(4))); 

В качестве альтернативы, если значение перед номером не является постоянной длины, вам можно использовать Regex тянуть числовое значение из:

var op = List.OrderBy(x => int.Parse(Regex.Match(x.data, "\\d+").Value)); 
+0

если я поставил orderbydescending, то выше будет работать правильно – anand

+0

ошибка, отображаемая в «Regex» – anand

+0

У вас есть 'using System.Text.RegularExpressions;'? – Abion47