我有以下表达式,它按股票代码对股票报价进行分组,并返回一个可观察的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操作符正确地表达这一点?
我想你需要:
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
})
);