我有以下表达式,它按符号对股票报价进行分组,并返回一个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运算符正确表达?
答案 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
})
);