C# RX challenge 5使用LINQ语言集成查询进行复杂事件处理(扰流板警报)
在RX站点的中,使用缓冲区完成质询5。我有一个使用LINQ点或lamba符号的解决方案。出于兴趣,我想将其转换为LINQ语言集成查询符号 挑战和我的代码如下。由于某些原因,C# RX challenge 5使用LINQ语言集成查询进行复杂事件处理(扰流板警报),c#,system.reactive,C#,System.reactive,在RX站点的中,使用缓冲区完成质询5。我有一个使用LINQ点或lamba符号的解决方案。出于兴趣,我想将其转换为LINQ语言集成查询符号 挑战和我的代码如下。由于某些原因,result2无法正常工作,这会使UI无响应,输出看起来被截断。这是不是有点怪,是不是我的问题,你能解决吗 挑战(下载) IObservable查询(IObservable引号) { //TODO:更改下面的查询以计算平均高值和平均低值 //过去五个交易日以及当前收盘和日期。 //提示:尝试使用缓冲区。 从引号中的引号返回 其
result2
无法正常工作,这会使UI无响应,输出看起来被截断。这是不是有点怪,是不是我的问题,你能解决吗
挑战(下载)
IObservable查询(IObservable引号)
{
//TODO:更改下面的查询以计算平均高值和平均低值
//过去五个交易日以及当前收盘和日期。
//提示:尝试使用缓冲区。
从引号中的引号返回
其中quote.Symbol==“MSFT”
选择新建{quote.Close,quote.Date};
}
我的解决方案
IObservable<object> Query(IObservable<StockQuote> quotes)
{
// TODO: Change the query below to compute the average high and average low over
// the past five trading days as well as the current close and date.
// HINT: Try using Buffer.
var result1 = quotes.Where(qt => qt.Symbol == "MSFT").Buffer(5, 1).Select(quoteList =>
{
var avg = quoteList.Average(qt => qt.Close);
return new { avg, quoteList.Last().Close, quoteList.Last().Date };
});
var result2 = from quote in quotes
where quote.Symbol == "MSFT"
from quoteList in quotes.Buffer(5, 1)
let avg = quoteList.Average(qt => qt.Close)
select new { avg, quoteList.Last().Close, quoteList.Last().Date };
return result2;
}
IObservable查询(IObservable引号)
{
//TODO:更改下面的查询以计算平均高值和平均低值
//过去五个交易日以及当前收盘和日期。
//提示:尝试使用缓冲区。
var result1=quotes.Where(qt=>qt.Symbol==“MSFT”).Buffer(5,1)。选择(quoteList=>
{
var avg=quoteList.Average(qt=>qt.Close);
返回新的{avg,quoteList.Last().Close,quoteList.Last().Date};
});
var result2=来自引号中的引号
其中quote.Symbol==“MSFT”
从引号中的引号列表。缓冲区(5,1)
让平均值=quoteList.Average(qt=>qt.Close)
选择新建{avg,quoteList.Last().Close,quoteList.Last().Date};
返回结果2;
}
我认为查询应该更像这样:
var result =
from quote in quotes
where quote.Symbol == "MSFT"
from quoteList in quotes.Buffer(5, 1)
let avgHigh = quoteList.Average(qt => qt.High)
let avgLow = quoteList.Average(qt => qt.Low)
select new { avgHigh, avgLow, quote.Close, quote.Date };
但这与您的问题只有细微的区别-只是当quote
可以做时,不需要做quoteList.Last()
,问题要求的是High
和Low
的平均值,而不是Close
从我可以看出,问题与图表有关,而不是与Rx组件有关。我认为图表经常被重绘,以至于被阻塞。两种解决方案都多次订阅引号(甚至超过两次-记住,多个from子句会导致在引擎盖下调用SelectMany),因此已经有问题了:-)。请重试。问题要求同时绘制两个图形(当前、平均)。 我认为不可能使用bind monad(
SelectMany
)独立地组合问题指定的这两个流的最新值
引号向下的理解。Buffer
将绑定到缓冲流的速率
或者:
quotes = quotes.Publish().RefCount();
return Observable.CombineLatest
(
first: quotes,
second: quotes.Buffer(5, 1).Select(
buffer => new { High = buffer.Average(q => q.High), Low = buffer.Average(q => q.Low) }),
resultSelector: (l, r) => new { l.Close, l.Date, r.High, r.Low }
);
以与源相同的速率移动,从而生成平滑的图形。我最初尝试了这种方法,但它有与上面相同的问题,并且还生成多个输出行。问题可能与图表更新有关,但为什么Labmda版本,即
result1
工作得这么好?我觉得有点愚蠢。我已将链式Select
转换为单个SelectMany
。这就是问题所在。result1
是正确的选择。最终的流绑定到缓冲流,因此当前值每5次只更新一次。@Asti-因为它是一个SelectMany
它产生了“n平方”值,其中n是引号
序列的元素数。这就是造成图表死亡的原因。嗨,阿斯蒂,谢谢你的回答,不过我不明白,你能再详细解释一下吗?。插入它也不起作用,因为CombineTest无法推断类型参数。把
放进去,会使它编译,但图表上什么也没有显示。我不明白为什么它不应该编译。内置版本位于bin
文件夹中。它通过组合两个流的最新值来工作,第一个流包含所有引号,第二个流每5次生成平均高值和低值。resultSelector
决定如何组合这两个流。恐怕还是不行。编译器错误:System.Reactive.Linq.Observable.CombineTest(System.IObservable,System.IObservable,System.Func)方法的类型参数无法从用法中推断。尝试显式指定类型参数。
在图形上没有结果。@SDK尝试用new StockQuote{…}
替换new{…}
quotes = quotes.Publish().RefCount();
return Observable.CombineLatest
(
first: quotes,
second: quotes.Buffer(5, 1).Select(
buffer => new { High = buffer.Average(q => q.High), Low = buffer.Average(q => q.Low) }),
resultSelector: (l, r) => new { l.Close, l.Date, r.High, r.Low }
);