S>А его можно инициализировать не только ObservableCollection, но и произвольным результатом linq-2-observable, который сам порождает события с учётом критериев отбора/проекции и прочего.
Так и есть.
IB>>Кроме 2 указателей, у меня в каждом OC вычислении ещё полно потрохов. Ситуация по памяти может значительно ухудшиться, если присутствует параметрозависимое вложенное вычисление, например
IB>>IB>>sourceCollection1.Filtering(sc1i => sourceCollection2.ContainsComputing(sc1i).Value)
IB>>
IB>>Здесь на каждый элемент коллекции sourceCollection1 будет создаваться отдельное вычисление ContainsComputing.
S>А можете поподробнее объяснить, что значит эта строчка кода? Что такое ContainsComputing и вообще смысл такого Filtering?
Перевожу на linq-2-objects дополнив примером из реальной жизни:
IEnumerable<Order> filteredOrders = orders.Where(o =>
selectedOrderTypes.Contains(
o.Type))
Вот OC верcия:
ObservableCollection<Order> filteredOrders = orders.Filtering(o =>
selectedOrderTypes.ContainsComputing<OrderType>(
Expr.Is(() => o.Type).Computing()).Value);
selectedOrderTypes тоже должна быть ObservableCollection<OrderType>. Order должен реализовать INotifyPropertyChanged.
Далее можно менять selectedOrderTypes (add, remove), можно менять свойство Type у любого Order, можно менять коллекцию orders:
filteredOrders всегда будет содержать свежий результат.
Заметь что, в ContainsComputing аргумент o.Type передаётся не как значение (как в случае linq-2-objects), а как OC вычисление. (Похоже как передача аргументов по значению и по ссылке.) Это нужно чтобы во вложенном вычислении отслеживалось значение свойства Order.Type. Вот тебе ещё одна причина почему нельзя так просто использовать перегруженные linq-2-objects методы, как ты предлагал.
Expr.Is просто возвращает выражение переданное ему в аргументе. Иначе в C# не прицепить экстеншен метод к выражению.