【发布时间】:2022-01-12 16:08:49
【问题描述】:
我正在尝试创建一个具有以下行为的 Rx.Net 运算符:
- 当事件属于“正常类型”时,直接返回该事件
- 当事件属于“特殊类型”时,等待您在一定时间内收到重复的该类型事件
我想要像下面这样的大理石。
当消息类型为A或B时,我们直接发送。当消息是 C 时,我们要确保它不仅仅是一个传递状态,并且只有在一定时间内是这样的情况下才发送它。这是通过第一个C 和我们收到的当前C 之间的时间来衡量的。在该特定时间之后,所有C 都被“接受”,我们将它们作为正常的传递。
这是我们收到 C 时的样子,它只是传递性的,我们想忽略它。
我尝试用Scan 运算符做一些事情,当我有一个特定的值时,我会尝试返回以前/当前的值,但感觉真的很hacky。
这是我编写的一些代码,用于演示我的尝试。在那种情况下,“特殊类型”只是当值为 999 时,但在运算符中,我想做的可能是另一个测试,甚至是传递给我的运算符的函数。
var oneObservable = Observable.Interval(TimeSpan.FromSeconds(1)).Select(_ => 999);
var intObservable = Observable.Interval(TimeSpan.FromSeconds(1)).Select(value => (int)value);
var myObservable = intObservable.Take(4).Concat(oneObservable.Take(3)).Timestamp().Repeat();
var test = myObservable.Scan(
(previous: default(Timestamped<int>), current: default(Timestamped<int>)),
(accumulated, current) =>
{
if (current.Value == 999)
{
if (accumulated.previous.Value != 999)
{
return (accumulated.current, current);
}
return (accumulated.previous, current);
}
else if(accumulated.current.Value == 999){
return (accumulated.previous, current);
}
return (accumulated.current, current);
})
.Where(
value => value.current.Value != 999
|| (value.previous.Value == 999 && value.current.Timestamp - value.previous.Timestamp > TimeSpan.FromSeconds(1.5)))
.Select(value => value.current);
【问题讨论】:
标签: c# system.reactive