响应式扩展——等效LINQ表达式作为流畅表达式

本文关键字:表达式 LINQ 扩展 等效 响应 | 更新日期: 2023-09-27 18:06:50

我有以下表达式,它按股票代码对股票报价进行分组,并返回一个可观察的PriceChange对象序列,该序列反映了同一股票代码的两个刻度之间的价格差异:

return from q in quotes
       group q by q.Symbol into g
       from b in g.Buffer(2, 1)
       select new PriceChange() { Symbol = b[0].Symbol, Change = (b[1].Price - b[0].Price) / b[0].Price };

我想做的是使用LINQ流畅表达式编写等效表达式。我最接近的是:

return quotes.GroupBy(q => q.Symbol)
             .Select(g => g.ToList()
                 .SelectMany(l => l)
                 .Buffer(2, 1)
                 .Do(b => Console.WriteLine(b[0].Symbol + "-" + b[1].Symbol))
                 .Select(b => new PriceChange())
              );

然而,当我需要的只是IObservable<PriceChange>

时,这个表达式的返回类型是IObservable<IObservable<PriceChange>>,因此无法编译。

如果我尝试添加这样的SelectMany子句:

return quotes.GroupBy(q => q.Symbol)
             .Select(g => g.ToList()
                 .SelectMany(l => l)
                 .Buffer(2, 1)
                 .Do(b => Console.WriteLine(b[0].Symbol + "-" + b[1].Symbol))
                 .Select(b => new PriceChange())
              ).SelectMany(o => o);

它编译但不产生任何输出。

我在这里做错了什么?如何使用流畅的LINQ操作符正确地表达这一点?

响应式扩展——等效LINQ表达式作为流畅表达式

我想你需要:

return quotes
    .GroupBy(q => q.Symbol)
    .SelectMany(g => g.Buffer(2, 1).Select(b => new PriceChange {
        Symbol = b[0].Symbol,
        Change = (b[1].Price - b[0].Price) / b[0].Price
     })
    );