Информация об изменениях

Сообщение Re[10]: Observable computations от 19.11.2019 13:39

Изменено 19.11.2019 14:16 igor-booch

Re[10]: Observable computations
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(Expr.Is(() => o.Type).Computing()));


selectedOrderTypes тоже должна быть ObservableCollection<OrderType>. Order должен реализовать INotifyPropertyChanged.
Далее можно менять selectedOrderTypes (add, remove), можно менять свойство Type у любого Order, можно менять коллекцию orders:
filteredOrders всегда будет содержать результат актуальное вычисленное значение.

Пока переписывал на пример из реальной жизни заметил баг. В ContainsComputing аргумент o.Type передавался как константа, а нужно было передавать OC вычисление. (Похоже как передача аргументов по значению и по ссылке.) Вот тебе ещё одна причина почему нельзя так просто использовать перегруженные linq-2-objects методы, как ты предлагал.
Re[10]: Observable computations
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<string>(Expr.Is(() => o.Type).Computing()).Value);


selectedOrderTypes тоже должна быть ObservableCollection<OrderType>. Order должен реализовать INotifyPropertyChanged.
Далее можно менять selectedOrderTypes (add, remove), можно менять свойство Type у любого Order, можно менять коллекцию orders:
filteredOrders всегда будет содержать результат актуальное вычисленное значение.

Пока переписывал на пример из реальной жизни заметил баг. В ContainsComputing аргумент o.Type передавался как константа, а нужно было передавать OC вычисление. (Похоже как передача аргументов по значению и по ссылке.) Вот тебе ещё одна причина почему нельзя так просто использовать перегруженные linq-2-objects методы, как ты предлагал.