2017-02-09 21 views
0

Я использую MVVM, и я хочу отсортировать мой ComboBox по возрастанию числа. Мои объекты (из базы данных), хранящиеся в ObservableCollection, всегда являются номерами, хранящимися в виде строки.C# Номера заказов в ComboBox, которые являются строками с использованием Linq (ObservableCollection)

Как только я прохожу мимо 10, мой ComboBox показывает 1, а затем 10.

Могу ли я настроить Linq для правильной сортировки?

Или я пытаюсь это неправильно?

public ObservableCollection<clsItemsModel> MyCollection 
{ 
    get { return _MyCollection; } 
    set 
    { 
     _MyCollection = value; 
     RaisePropertyChanged(); 
    } 
} 

private void LoadData() 
{ 
    MyCollection = _clsItemsDataService.GetItems(); 
    MyCollection.OrderBy(p => p.Items); 
} 
+2

Вам необходимо преобразовать строки в int перед сортировкой, если вы хотите, например, 1 3 9 10 вместо 1 10 3 9. – itsme86

+3

'int.Parse (p.Items)'? (Хотя 'Items' кажется неинтуитивным именем для * единственного значения *.) – David

+0

Ответ здесь: http://stackoverflow.com/questions/6396378/c-sharp-linq-orderby-numbers-that-are- string-and-you-can not-convert-them-to-int –

ответ

0

Вам нужно преобразовать строки в целые числа при сортировке. Это можно сделать так:

MyCollection = new ObservableCollection<clsItemsModel>(_clsItemsDataService.GetItems() 
            .OrderByDescending(p => Convert.ToInt32(p.Items))); 

Но е вы должны бояться, что Items может содержать вещи, которые не могут быть преобразованы в целые числа, то лучше использовать int.TryParse():

MyCollection = new ObservableCollection<clsItemsModel>(_clsItemsDataService.GetItems() 
        .OrderByDescending(p => 
        { 
         int n; 
         return int.TryParse(p.Items, out n) ? n : int.MinValue; 
        })); 

Примечание что OrderByDescending is не метод экземпляра ObservableCollection<T>. Он не сортирует этот экземпляр, но возвращает новый IEnumerable<T>, который представляет отсортированную последовательность. Thatswhy я создаю новый ObservableCollection<clsItemsModel> из отсортированной последовательности, возвращаемой OrderByDescending.


Второе примечание: вы сказали, что вы хотите "восходящие" номера, но и использовать OrderByDescending. Я скопировал эту часть, возможно, вы захотите использовать OrderBy.

+0

ЭТО РАБОТАЕТ !!! Да, это была ошибка с помощью OrderByDescending, потому что я пытался увидеть, что будет делать combobox. Забыл изменить его обратно. –