2013-07-11 2 views
0

У меня странная проблема с LINQ.LINQ order-by isue

У меня есть таблица, которую нужно заказать по 4 столбцам ... из 8 столбцов. Строки в этой таблице являются хронологическими (упорядочены по дате).

Допустим, что 8 смещ_по_столбцам в таблице А, В, С, D, Е, F, G, Н

мне нужна таблица заказанный F, E, D, B

F = > строка

Е => строка

D => строка

В => DateTime

я есть writt ru LINK-

List<Rows> OrderedListOfRows = listOfRows.OrderBy(i => i.F).ThenBy(i=>i.E).ThenBy(i=>i.D).ThenBy(i=>i.B); 

Я выполняю операции над этой последовательностью и получаю требуемый результат. Однако я заметил ошибку.

Если мой пример ввода строки для D является "input1", "input2", "вход3" ..... "input10", "input11"

функция OrderBy сортирует записи, как: "input1" , «input10», «input11», «input2», «input3» ... потому что D - это строка.

Однако я хочу оригинальный заказ сохранившийся (который не является проблемой, если у меня нет «input10», «input11» и т.д ....

Как я этого добиться?

Спасибо заранее

PS Я старался изо всех сил, чтобы объяснить проблему Если есть что-нибудь еще, оставьте меня комментарий

Edit:.. Я решил эту проблему, я вхожу в новый список со старым списком на. этот столбец, чтобы мой заказ был сохранен. в любом из предложенных «дублирующих» вопросов.

ответ

0

если вы хотите заказать по номеру в строке, вы можете попробовать это:

int MyOrderBy(string str) 
{ 
    Regex reg=new Regex("\\d+"); 
    Match m=reg.Match(str); 
    if(m.Success) return int.Parse(m.Value); 
    else return int.MinValue; 
} 

Затем Закажите:

List<Rows> OrderedListOfRows = listOfRows.OrderBy(i => MyOrderBy(i.F)) 
              .ThenBy(i=>MyOrderBy(i.E)) 
              .ThenBy(i=>MyOrderBy(i.D)) 
              .ThenBy(i=>i.B).ToList(); 
0

Если у вас есть предсказуемые записи в D можно разобрать строку в вашем порядке следующим образом:

List<Rows> OrderedListOfRows = listOfRows 
    .OrderBy(i => i.F) 
    .ThenBy(i=>i.E) 
    .ThenBy(i=>i.D.Substring(0,5)) 
    .ThenBy(i=>Convert.ToInt16(i.D.Substring(6))) 
    .ThenBy(i=>i.B);