2015-03-28 2 views
2

У меня есть список элементов и я использую следующий код, чтобы отсортировать этот список элементовСортировка строка свойство, как Integer LINQ

List<ModelItems> sorted_items = originalItems.OrderBy(i => i.Page).ToList(); 

где Страница является имущество, которое может быть либо целое число или string, поэтому я устанавливаю его как тип String и не является обязательным свойством в модели. Так может быть и пустым.

Но при сортировке, так как его строка теперь она дает элементы в таком порядке, например 1,17,3,37,5 «», «s» и т.д.

Можно ли сортировать список с помощью Linq в целостный путь?

Как результат должен быть числами первой, то строки, как 1,3,5,17,37, «б», «г», «», .....

+0

ли вы считаете реализовать IComparable в ModelItems-класса? Затем просто скомпонован оригиналItems.OrderBy(). – Tobias

ответ

2

Вы можете попробовать это:

var firstPart = originalItems.Where(x => !String.IsNullOrEmpty(x) && x.Page.All(char.IsDigit)).OrderBy(x => Convert.ToInt32(x.Page)); 
var secondPart = originalItems.Where(x => !String.IsNullOrEmpty(x) && !x.Page.All(char.IsDigit)).OrderBy(x => x.Page); 
var thirdPart = originalItems.Where(x => String.IsNullOrEmpty(x)).ToList(); 

var result = firstPart.Union(secondPart).Union(thirdPart).ToList(); 
+0

Я пробовал это, но получаю ошибку Невозможно преобразовать тип 'string' в 'int' здесь .OrderBy (x => (int) x.Page); Поскольку моя страница имеет тип String –

+0

@JMat Попробуйте мое обновление. Список 'OriginalItems' - это список? –

+0

Да Orignal также является списком, и обновление решает проблему. :) –

4

Вам необходимо реализовать IComparer для String. См. Use own IComparer<T> with Linq OrderBy. В компаменте вы можете проверить, может ли первая и строка быть разобраны в int и действовать соответственно. У вас есть 4 случая для обработки:

Int, Int

INT, строка

строку, INT

строку, строка

Случай 1 и 4 являются прямыми. В случае 2 и 3 вы решаете, хотите ли вы сначала инт или наоборот.

1

Я сделал это немного по-другому, но получил тот же результат

Первый я создал метод расширения

public static class CollectionsUtils 
{ 
    public static bool isPageIntegrable(this ModelItems modelItem) 
    { 
     int integrable = 0; 
     bool result = Int32.TryParse(modelItem.Page, out integrable); 
     return result; 
    } 

.... 

Этот второй метод, я используемый для отображения списка

public static void displayList<T>(this List<T> list) 
    { 
     Console.Write("["); 
     foreach (T t in list) 
     { 
      Console.Write(t); 
     } 
     Console.WriteLine("]"); 
    } 

Затем я создаю следующий метод DoSort

public void DoSort() 
    { 
     List<ModelItems> sorted_items = originalItems.Where(i => i.isPageIntegrable()).OrderBy(i => Int32.Parse(i.Page)).ToList(); 
     List<ModelItems> second_part = originalItems.Where(i => !i.isPageIntegrable()).OrderBy(i => i.Page).ToList(); 
     var final_sorted = sorted_items.Union(second_part).ToList(); 

     final_sorted.displayList(); 
     Console.ReadKey(); 
    } 

Результат: sort

Смежные вопросы