的問題,我試圖解決Rx.Net - 獲取股票價格的變化,並進行處理
- 獲取股票蜱
- 始終考慮最新股價
- 每個X秒取快照的蜱併發送處理
所以我有一個Observable
股票蜱的來源。它只發送我感興趣的股票的蜱。我需要做的是收到這個股票價格,並在每個x秒(例如,讓我們說每3秒)發送一個快照處理價格。如果在3秒鐘內收到同一只股票的2個蜱蟲,我只需要最新的蜱蟲。這個處理計算量很大,所以如果可能的話,我希望避免兩次處理相同的股票價格。
舉一個例子。
假設在序列的開始,我收到2個刻度 - >MSFT:1 $,GOOG:2 $。
在接下來的3秒內我什麼也沒收到,所以MSFT & GOOG應該發送處理滴答。
現在下一秒我收到新的節拍 - >MSFT:1 $,GOOG:3 $,INTL:3 $
再次讓我們接下來的3秒沒有一樣是在範圍內承擔
這裏。 ,因爲MSFT價格沒有變化(它仍然是1美元),只有GOOG & INTL應該發送處理。
而這一直重複一整天。
現在,我認爲Rx幫助解決這種問題,容易&優雅的方式。但我有一個問題,有適當的查詢。 這是我到目前爲止,會盡量解釋它做什麼,什麼是它的問題
var finalQuery =
from priceUpdate in **Observable<StockTick>**
group priceUpdate by priceUpdate.Stock into grouped
from combined in Observable.Interval(TimeSpan.FromSeconds(3))
.CombineLatest(grouped, (t, pei) => new { PEI = pei, Interval = t })
group combined by new { combined.Interval } into combined
select new
{
Interval = combined.Key.Interval,
PEI = combined.Select(c => new StockTick(c.PEI.Stock, c.PEI.Price))
};
finalQuery
.SelectMany(combined => combined.PEI)
.Distinct(pu => new { pu.Stock, pu.Price })
.Subscribe(priceUpdate =>
{
Process(priceUpdate);
});
public class StockTick
{
public StockTick(string stock, decimal price)
{
Stock = stock;
Price = price;
}
public string Stock {get;set;}
public decimal Price {get;set;}
}
因此,這得到了股票價格,團體它通過股票,再結合最新的這組
ed序列與Observable.Interval
。通過這種方式,我試圖確保只處理股票的最新股票價格,並且每3秒啓動一次。
然後它再次按照時間間隔對它進行分組,結果我有通過的每3秒間隔的一組序列。
作爲最後一步,我使用SelectMany
將此序列扁平化爲股票價格更新的順序,並且我正在應用Distinct
以確保同一個股票的相同價格不會被處理兩次。
這個查詢有2個問題我不喜歡。首先是我不喜歡雙人組合 - 有什麼辦法可以避免嗎?其次 - 用這種方法,我必須逐一處理價格,我真正想要的是快照 - 這是在3秒鐘內,無論我有什麼我會扣上來發送處理,但無法弄清楚如何到扣起來。
我很樂意提供其他方式解決此問題的建議,但我寧願留在Rx內,除非真的有更好的方法。
在你的例子中,你不會發送微軟,因爲它沒有改變,但Google和你也沒有發送。你能澄清一下嗎? – Enigmativity
@Enigmativity道歉混淆,意味着寫**谷歌:3 $ ** ...將更新現在的帖子 – Michael