【问题标题】:Reactive Extensions - Equivalent LINQ expression as fluent expressionReactive Extensions - 将 LINQ 表达式等效为 fluent 表达式
【发布时间】:2014-06-04 21:02:09
【问题描述】:

我有以下表达式,它按代码对股票报价进行分组,并返回一个可观察的 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 fluent 表达式编写等效表达式。我最接近的是:

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 运算符正确表达这一点?

【问题讨论】:

标签: c# linq system.reactive


【解决方案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
     })
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2018-09-29
    相关资源
    最近更新 更多