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

Сообщение Re[2]: Observable calculations от 17.11.2019 16:44

Изменено 17.11.2019 17:00 igor-booch

Re[2]: Observable calculations
S>А почему не сделать собственно Linq?
S>Я имею в виду — примерно так:
S>
S>static void Main(string[] args)
S>{
S>  var orders = new ObservableCollection<Order>()
S>    {
S>       new Order(1, 15),
S>       new Order(2, 15),
S>       new Order(3, 25),
S>       new Order(4, 27),
S>       new Order(5, 30),
S>       new Order(6, 75),
S>       new Order(7, 80),
S>    });
S>  //********************************************
S>  // We start using ObservableCalculations here!
S>  var expensiveOrders = from o in orders where o.Price > 25 select o; 
S>  checkFiltering(orders, expensiveOrders); 
S>  expensiveOrders.CollectionChanged += (sender, eventArgs) =>
S>  { 
S>    // see the changes (add, remove, replace, move, reset) here
S>  };
S>  // Start the changing...
S>  orders.Add(new Order(8, 30));
S>  orders.Add(new Order(9, 10));
S>  orders[0].Price = 60;
S>  orders[4].Price = 10;
S>  orders.Move(5, 1);
S>  orders[1] = new Order(10, 17);

S>  checkFiltering(orders, expensiveOrders); // Prints "True"
S>

S>И, соответственно,
S>
S>  var discountedOrders = from o in orders select new {o.Num, o.Price, o.Discount, DiscountedPrice = o.Price - o.Price * o.Discount / 100};
S>


S>В текущем виде как-то оно многословно выходит.


Не понимаю где в коде выше точка, в которой возможно подключить использование OC.
Я думал на там чтобы заюзать LINQ к IQueryable, тогда были бы стандартные LINQ функции, но код был бы более громоздким:

    CollectionCalculationSource<Order> orders = 
        new ObservableCollection<Order>(new []
        {
            new Order(1, 15),
            new Order(2, 15),
            new Order(3, 25),
            new Order(4, 27),
            new Order(5, 30),
            new Order(6, 75),
            new Order(7, 80),
        }).AsObservableCalculationSource();
    
    //********************************************
    // We start using ObservableCalculations here!
    var expensiveOrders = (from o in orders where o.Price > 25 select o).Observe();
    
    checkFiltering(orders, expensiveOrders); // Prints "True"
    
    expensiveOrders.CollectionChanged += (sender, eventArgs) =>
    {
        // see the changes (add, remove, replace, move, reset) here
    };


В принципе любой желающий может создать IQueryable wrapper для OC, но я смысла в этом не вижу.
Re[2]: Observable calculations
S>А почему не сделать собственно Linq?
S>Я имею в виду — примерно так:
S>
S>static void Main(string[] args)
S>{
S>  var orders = new ObservableCollection<Order>()
S>    {
S>       new Order(1, 15),
S>       new Order(2, 15),
S>       new Order(3, 25),
S>       new Order(4, 27),
S>       new Order(5, 30),
S>       new Order(6, 75),
S>       new Order(7, 80),
S>    });
S>  //********************************************
S>  // We start using ObservableCalculations here!
S>  var expensiveOrders = from o in orders where o.Price > 25 select o; 
S>  checkFiltering(orders, expensiveOrders); 
S>  expensiveOrders.CollectionChanged += (sender, eventArgs) =>
S>  { 
S>    // see the changes (add, remove, replace, move, reset) here
S>  };
S>  // Start the changing...
S>  orders.Add(new Order(8, 30));
S>  orders.Add(new Order(9, 10));
S>  orders[0].Price = 60;
S>  orders[4].Price = 10;
S>  orders.Move(5, 1);
S>  orders[1] = new Order(10, 17);

S>  checkFiltering(orders, expensiveOrders); // Prints "True"
S>

S>И, соответственно,
S>
S>  var discountedOrders = from o in orders select new {o.Num, o.Price, o.Discount, DiscountedPrice = o.Price - o.Price * o.Discount / 100};
S>


S>В текущем виде как-то оно многословно выходит.


Не понимаю где в коде выше точка, в которой возможно подключить использование OC.
Я думал на тем чтобы заюзать LINQ к IQueryable, тогда были бы стандартные LINQ функции, но код был бы более громоздким:

    CollectionCalculationSource<Order> orders = 
        new ObservableCollection<Order>(new []
        {
            new Order(1, 15),
            new Order(2, 15),
            new Order(3, 25),
            new Order(4, 27),
            new Order(5, 30),
            new Order(6, 75),
            new Order(7, 80),
        }).AsObservableCalculationSource();
    
    //********************************************
    // We start using ObservableCalculations here!
    var expensiveOrders = (from o in orders where o.Price > 25 select o).Observe();
    
    checkFiltering(orders, expensiveOrders); // Prints "True"
    
    expensiveOrders.CollectionChanged += (sender, eventArgs) =>
    {
        // see the changes (add, remove, replace, move, reset) here
    };


В принципе можно создать IQueryable wrapper для OC, но я смысла в этом не вижу.