Сортировка ObservableCollection - каков наилучший подход?

У меня есть ObservableCollection, где MyData - это класс с 4 свойствами. i.e int id, имя строки, bool IsSelected, строка IsVisible.

Этот ObservableCollection привязан к combobox с флажками (например, данные о городах). Теперь, когда пользователь проверяет флажки, в следующий раз, когда он открывает раскрывающийся список - все выборы должны появляться сверху в порядке возрастания по имени.

Я также выполнил автоматическое завершение, когда пользователь набирает 3 символа в поле со списком, откроется раскрывающийся список, показывающий все варианты выбора, а затем все элементы, начиная с 3 символов, вводится пользователем.

Я исследовал и реализовал следующий код, и он работает нормально, но я хочу знать, является ли это лучшим подходом или я могу реализовать это лучше, код:

        IEnumerable<MyData> sort;
        ObservableCollection<MyData> tempSortedCities = new ObservableCollection<MyData>();
        sort = City.OrderByDescending(item => item.IsSelected).ThenBy(item => item.Name.ToUpper()) ; 
       // City is my observablecollection<MyData> property in my Model binded to combobox in UI
        foreach (var item in sort)
            tempSortedCities.Add(item);


        City.Clear(); // City is my observablecollection<MyData> property in my Model
        City = tempSortedCities;
        tempSortedCities = null;
        sort = null;  

Заранее благодарим за ваше время!

Ответы

Ответ 1

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

Вы можете получить экземпляр ICollectionView для своей коллекции, используя следующий код:

var sortedCities  = CollectionViewSource.GetDefaultView(City);

Затем вы можете настроить сортировку, добавив экземпляры типа SortDescription в коллекцию ICollectionView.SortDescriptions:

sortedCities.SortDescriptions.Add(new SortDescription("IsSelected", ListSortDirection.Descending));
sortedCities.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

Затем вы можете привязать ваш ComboBox непосредственно к представлению коллекции (вместо коллекции City), и он отобразит уже отсортированные данные.