Использование LINQ в наблюдаемой коллекции без потери подписок на события C#

Я пытаюсь использовать LINQ для сортировки ObservableCollection, проблема в том, что методы LINQ возвращают IOrderedEnumerable, и нет метода для преобразования этого типа напрямую в ObservableCollection. После некоторого поиска я обнаружил способ сделать это, используя конструктор из класса ObservableCollection для создания нового с помощью IOrderedEnumerable:

MyObservableCollection = new ObservableCollection<T>(someIOrderedEnumerable);

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

В настоящее время я очищаю Observable Collection, а затем добавляю объекты, которые были возвращены методом LINQ, один за другим в Observable Collection, проблема в том, что это вызывает событие CollectionChanged много раз, когда я использую LINQ для его заказа:

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
MyObservableCollection.Clear();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
  {
      MyObservableCollection.Add(pivotList[i]);
  }

Главный вопрос: как заказать наблюдаемую коллекцию, не теряя подписки на событие CollectionChanged?

Я подумал о том, чтобы сохранить EventHandler и переназначить его после создания новой отсортированной наблюдаемой коллекции, но пока не смог реализовать это.

Edit1: немного поработав, я нашел решение для методов LINQ, которые только сортируют коллекции, вместо того, чтобы очищать наблюдаемую коллекцию, а затем добавлять одну за другой, вместо этого я просто устанавливаю значения (что не запускает событие CollectionChanged):

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
    {
        MyObservableCollection[i] = pivotList[i];
    }

1 ответ

Моя библиотека ObservableComputations может вам помочь. Используя эту библиотеку, ваш код будет выглядеть следующим образом:

    ObsevableCollection<Item> orderedObsevableCollection = MyObservableCollection.Ordering(i => i.OrderKey);

ObsevableCollection будет отражать все изменения в MyObservableCollection и свойстве OrderKey всех элементов.

Другие вопросы по тегам