Сообщение Re[10]: Observable computations от 19.11.2019 13:39
Изменено 19.11.2019 14:07 igor-booch
Re[10]: Observable computations
S>А его можно инициализировать не только ObservableCollection, но и произвольным результатом linq-2-observable, который сам порождает события с учётом критериев отбора/проекции и прочего.
Так и есть.
IB>>Кроме 2 указателей, у меня в каждом OC вычислении ещё полно потрохов. Ситуация по памяти может значительно ухудшиться, если присутствует параметрозависимое вложенное вычисление, например
IB>>
IB>>Здесь на каждый элемент коллекции sourceCollection1 будет создаваться отдельное вычисление ContainsComputing.
S>А можете поподробнее объяснить, что значит эта строчка кода? Что такое ContainsComputing и вообще смысл такого Filtering?
Перевожу на linq-2-objects дополнив примером из реальной жизни:
Вот OC верcия:
selectedOrderTypes тоже должна быть ObservableCollection<OrderType>. Order должен реализовать INotifyPropertyChanged.
Далее можно менять selectedOrderTypes (add, remove), можно менять свойство Type у любого Order, можно менять коллекцию orders:
filteredOrders всегда будет содержать результат актуальное вычисленное значение.
Пока переписывал на пример из реальной жизни заметил баг. В ContainsComputing аргумент o.Type передавался как константа, а нужно было передавать OC вычисление. Похоже как передача аргументов по значению и по ссылке.
Так и есть.
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 вычисление. Похоже как передача аргументов по значению и по ссылке.
Re[10]: Observable computations
S>А его можно инициализировать не только ObservableCollection, но и произвольным результатом linq-2-observable, который сам порождает события с учётом критериев отбора/проекции и прочего.
Так и есть.
IB>>Кроме 2 указателей, у меня в каждом OC вычислении ещё полно потрохов. Ситуация по памяти может значительно ухудшиться, если присутствует параметрозависимое вложенное вычисление, например
IB>>
IB>>Здесь на каждый элемент коллекции sourceCollection1 будет создаваться отдельное вычисление ContainsComputing.
S>А можете поподробнее объяснить, что значит эта строчка кода? Что такое ContainsComputing и вообще смысл такого Filtering?
Перевожу на linq-2-objects дополнив примером из реальной жизни:
Вот OC верcия:
selectedOrderTypes тоже должна быть ObservableCollection<OrderType>. Order должен реализовать INotifyPropertyChanged.
Далее можно менять selectedOrderTypes (add, remove), можно менять свойство Type у любого Order, можно менять коллекцию orders:
filteredOrders всегда будет содержать результат актуальное вычисленное значение.
Пока переписывал на пример из реальной жизни заметил баг. В ContainsComputing аргумент o.Type передавался как константа, а нужно было передавать OC вычисление. (Похоже как передача аргументов по значению и по ссылке.) Вот тебе ещё одна причина почему нельзя так просто использовать перегруженные linq-2-objects методы, как ты предлагал.
Так и есть.
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 методы, как ты предлагал.