C# RX challenge 5使用LINQ语言集成查询进行复杂事件处理(扰流板警报)

C# RX challenge 5使用LINQ语言集成查询进行复杂事件处理(扰流板警报),c#,system.reactive,C#,System.reactive,在RX站点的中,使用缓冲区完成质询5。我有一个使用LINQ点或lamba符号的解决方案。出于兴趣,我想将其转换为LINQ语言集成查询符号 挑战和我的代码如下。由于某些原因,result2无法正常工作,这会使UI无响应,输出看起来被截断。这是不是有点怪,是不是我的问题,你能解决吗 挑战(下载) IObservable查询(IObservable引号) { //TODO:更改下面的查询以计算平均高值和平均低值 //过去五个交易日以及当前收盘和日期。 //提示:尝试使用缓冲区。 从引号中的引号返回 其

在RX站点的中,使用缓冲区完成质询5。我有一个使用LINQ点或lamba符号的解决方案。出于兴趣,我想将其转换为LINQ语言集成查询符号

挑战和我的代码如下。由于某些原因,
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 }
            );