【发布时间】: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 运算符正确表达这一点?
【问题讨论】:
-
尝试使用 LINQpad 将 LINQ 转换为 Lambda 表达式见:stackoverflow.com/questions/1524813/…
标签: c# linq system.reactive