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

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

Изменено 19.11.2019 14:35 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<string>(
        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 методы, как ты предлагал.
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<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 методы, как ты предлагал.