2

RX サイトの複合イベント処理ワークショップでは、課題 5 は Buffer を使用して実行されます。LINQ ドットまたはラムバ表記を使用したソリューションがあります。興味深いので、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

0

この問題では、両方のグラフ (現在、平均) を同時に描画する必要があります。SelectManybind モナド ( ) を使用して、問題で指定されている 2 つのストリームの最新の値を個別に作成できるとは思えません。

以下の理解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 に答える
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()しかし、これにはあなたのものとの小さな違いしかありquoteません。HighLowClose

私が言えることから、問題はRxコンポーネントではなく、チャートで行うことです。チャートが頻繁に再描画されてブロックされていると思います。

于 2012-09-05T11:58:35.820 に答える