反应性扩展 - 等效LINQ表达式为流畅表达式

时间:2014-06-04 21:02:09

标签: c# linq system.reactive

我有以下表达式,它按符号对股票报价进行分组,并返回一个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<IObservable<PriceChange>>

时,这不会编译,因为该表达式的返回类型为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运算符正确表达?

1 个答案:

答案 0 :(得分:1)

我认为你需要:

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
     })
    );