Подтвердить что ты не робот

Закажите ObservableCollection <T> без создания нового

У меня есть следующий код для переопределения коллекции ObservableCollection<T>:

list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );

Этот код работает, но мне не нравится тот факт, что задействовано "новое". Есть ли способ изменить внутренний порядок элементов коллекции ObservableCollection<T> без создания нового?

Спасибо,

4b9b3361

Ответ 1

Учитывая, что OrderBy также новости массива соответствуют размеру вашей коллекции и нескольким другим объектам, у вас есть два варианта:

  • Откажитесь от LINQ OrderBy и напишите свой собственный вид, который выполняет сортировку на месте над вашим ObservableCollection с помощью метода Move.
  • Подождите, пока текущая реализация станет проблематичной, тогда примените 1.

Не волнуйся, новые вещи не так страшны. Linq делает это все время. Если это не узкое место, все хорошо. Если нет убедительных доказательств того, что сортировка на месте действительно ускорит показ, то здесь нет проблем.

Ответ 2

Внедрите свой собственный метод расширения сортировки для коллекции Observable

 public static class ObservableCollection
 {
      public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector)
      {
          List<TSource> sortedList = source.OrderBy(keySelector).ToList();
          source.Clear();
          foreach (var sortedItem in sortedList)
          {
              source.Add(sortedItem);
          }
     }
 }

Следующий ответ вдохновлен г-ном Жайдером на этот question

Ответ 3

Насколько я могу судить, ObservableCollection имеет метод перемещения элементов внутри коллекции. Вы должны получить компаратор для вашего T-типа, а затем использовать некоторый алгоритм сортировки

Ответ 4

Мой ответ вдохновлен bkk

 public static class ObservableCollection
    {
        public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector, bool isAZ)
        {
            if (isAZ)
            {
                List<TSource> sortedList = source.OrderBy(keySelector).ToList();
                source.Clear();
                foreach (var sortedItem in sortedList)
                {
                    source.Add(sortedItem);
                }
            }
            else
            {
                List<TSource> sortedList = source.OrderByDescending(keySelector).ToList();
                source.Clear();
                foreach (var sortedItem in sortedList)
                {
                    source.Add(sortedItem);
                }
            }         
        }
    }

Использование

 _someObservableCollection.Sort(x => x.Number, false); // Where number is an simple property (non-onject)