【发布时间】:2021-06-02 00:57:55
【问题描述】:
如何获取每个唯一键的最新值?
在这个示例中,我有股票代码和价格。我如何组合它以输出具有最新价格的独特股票?
在现实生活中,这种事件流将持续数年,我只需要股票的当前价格。
using System;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
namespace LearnRx
{
class Program
{
public class Stock
{
public string Symbol { get; set; }
public float Price { get; set; }
public DateTime ModifiedAt { get; set; }
public override string ToString()
{
return "Stock: " + Symbol + " " + Price + " " + ModifiedAt;
}
}
static void Main(string[] args)
{
var baseTime = new DateTime(2000, 1, 1, 1, 1, 1);
var fiveMinutes = TimeSpan.FromMinutes(5);
var stockEvents = new Stock[]
{
new Stock
{
Symbol = "MSFT",
Price = 100,
ModifiedAt = baseTime
},
new Stock
{
Symbol = "GOOG",
Price = 200,
ModifiedAt = baseTime + fiveMinutes
},
new Stock
{
Symbol = "MSFT",
Price = 150,
ModifiedAt = baseTime + fiveMinutes + fiveMinutes
},
new Stock
{
Symbol = "AAPL",
Price = 300,
ModifiedAt = baseTime + fiveMinutes + fiveMinutes + fiveMinutes
},
}.ToObservable();
var scheduler = new HistoricalScheduler();
var replay = Observable.Generate(
stockEvents.GetEnumerator(),
events => events.MoveNext(),
events => events,
events => events.Current,
events => events.Current.ModifiedAt,
scheduler);
replay
.Subscribe( i => Console.WriteLine($"Event: {i} happened at {scheduler.Now}"));
scheduler.Start();
}
}
}
【问题讨论】:
-
你能贴一张你想要的大理石图吗?如果您总是对最新价格感兴趣......这只是最新的活动。
-
上述代码的输出有 4 个条目,预期为 3。MSFT 应该只有一个输出。
-
“在现实生活中,这种事件流将持续数年,我只需要股票的当前价格。”在任何给定时刻,最近的事件是当前价格。你想发出所有事件吗?在测试用例中有结束,在现实生活中没有。
-
假设我想要计算 90 美元以上的股票数量,上面的代码将返回 4 而不是 3,因为它会重复计算 MSFT。就像我需要一个 combineLastest ,它需要一个键,在这种情况下是股票代码。 stock.CombineLastest(r => r.Symbol).Where(r => Price > 99)
-
作为一名在日常工作中实际执行此操作的开发人员,我建议您考虑使用
IDictionary<Stock, IObservable<Price>>而不是IObservable<IDictionary<Stock, Price>>。后者使您很难从订阅中删除股票...
标签: system.reactive