2

在 RX 站点的复杂事件处理研讨会中,挑战 5 使用 Buffer 完成。我有一个使用 LINQ 点或 Lamba 表示法的解决方案。出于兴趣,我想将其转换为 LINQ 语言集成查询符号。

接下来是挑战和我的代码。由于某种原因result2无法正常工作,它使 UI 无响应并且输出看起来被截断。这是什么时髦的东西,是我的查询,你能解决它吗?

挑战(在此处下载)

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.

    return from quote in quotes
           where quote.Symbol == "MSFT"
           select new { 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;
}
4

3 回答 3

1

两种解决方案都多次订阅引号(甚至超过两次 - 记住多个 from 子句会导致 SelectMany 调用),所以那里已经有问题了:-)。再试一次。

于 2012-09-05T22:30:03.003 回答
0

我认为查询应该看起来更像这样:

        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 };

但这与您的差异只有很小的差异 - 只是没有必要做quoteList.Last()when quotewould do & 问题要求 & 的平均值HighLow而不是Close.

据我所知,问题与图表有关,与 Rx 组件无关。我认为图表经常重绘以至于阻塞。

于 2012-09-05T11:58:35.820 回答
0

该问题要求同时绘制两个图(电流、平均值)。我不相信可以使用绑定 monad ( SelectMany) 来独立组合问题指定的这两个流的最新值。

向下的理解quotes.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 }
            );

以与源相同的速率移动,从而产生平滑的图形。

于 2012-09-06T09:34:32.787 回答