2014-01-25 6 views
2

У меня есть массив строк, как такСортировка массива на основе строки на двух условиях

May#01 
April#02 
Jan#03 

мне нужно разобраться в этом первом в алфавитном порядке, а затем числовым значением рядом с #. Алфавитный сорт очевиден, но я, кажется, не получаю числовую часть.

ответ

1
var input = new[] { "May#01", "April#02", "Jan#03", "Jan#02", "Jan#1" }; 
    var result = input.OrderBy(s => s.Split('#')[0]) 
     .ThenBy(s => Int32.Parse(s.Split('#')[1])); 

Результат:

[ 
"April#02", 
"Jan#1", 
"Jan#02", 
"Jan#03", 
"May#01" 
] 

Другой ответ будет производить вывод:

[ 
"April#02", 
"Jan#02", 
"Jan#03", 
"Jan#1", 
"May#01" 
] 

Что я предполагаю, что это неверно, так как Ян # 02 идет перед Ян # 1.

Вы можете сделать мой код более эффективным, выполнив разделение один раз и сохранив обе части в анонимном классе вместе с исходной строкой, но я не хочу свертывать код.

+0

Yup, который сработал, спасибо Ян, последнее, что мне нужно, чтобы все месяцы были разделены запятыми как конечная строка. – Codehelp

+0

@Codehelp вы можете использовать один и тот же метод 'Split', а также' Select' и 'string.Join' –

5

строки первого порядка по их значениям (что даст вам алфавитный вид). Затем процеживают целочисленной величиной, после символа #:

array.OrderBy(s => s) 
    .ThenBy(s => Int32.Parse(s.Split('#')[1])) 

Пример:

string[] array = { "May#01", "April#02", "Jan#03", "April#01" }; 
var query = array.OrderBy(s => s) 
       .ThenBy(s => Int32.Parse(s.Split('#')[1])); 

Результат:

"April#01" 
"April#02" 
"Jan#03" 
"May#01" 
Смежные вопросы