C# 如果X元素在过去的Y秒内弹出?
抱歉,这里的RX.NET有点新。。。在RX中我可以做很多事情,但不是我需要做的主要事情 我只希望在过去的Y秒内收到X个元素的可观测对象弹出。换句话说,在任何时间点,当按下新元素时,回顾过去的X元素,看看它们是否都发生在过去的Y秒内 我搞不懂“回顾和计数”的部分C# 如果X元素在过去的Y秒内弹出?,c#,system.reactive,C#,System.reactive,抱歉,这里的RX.NET有点新。。。在RX中我可以做很多事情,但不是我需要做的主要事情 我只希望在过去的Y秒内收到X个元素的可观测对象弹出。换句话说,在任何时间点,当按下新元素时,回顾过去的X元素,看看它们是否都发生在过去的Y秒内 我搞不懂“回顾和计数”的部分 似乎Window是正确的操作符,因为它是可滑动的,但也许我对Window的定义有偏见。我觉得应该在closer函数中这样做,但我还不是向导 此函数将返回属于ytimespan的x元素列表 public static IObservable
似乎Window是正确的操作符,因为它是可滑动的,但也许我对Window的定义有偏见。我觉得应该在closer函数中这样做,但我还不是向导 此函数将返回属于
y
timespan的x
元素列表
public static IObservable<IList<T>> GetFullWindows<T>(this IObservable<T> source, int x, TimeSpan y)
{
return source
.Publish(_obs => _obs
.Window(_obs, _ => Observable.Timer(y))
.SelectMany(window => window.Take(x).ToList())
.Where(l => l.Count == x)
);
}
publicstaticiobservable GetFullWindows(此IObservable源,intx,TimeSpan y)
{
返回源
.Publish(\u obs=>\u obs
.Window(_obs,=>Observable.Timer(y))
.SelectMany(window=>window.Take(x).ToList())
.其中(l=>l.计数==x)
);
}
下面是一个用法示例:
var obs = Observable.Generate(0, i => i < 20, i => i + 1, i => i, i => TimeSpan.FromMilliseconds((20 - i) * 100));
var b = obs
.GetFullWindows(4, TimeSpan.FromSeconds(4.5));
b.Subscribe(l => l.Dump()); //using Linqpad
var obs=Observable.Generate(0,i=>i<20,i=>i+1,i=>i,i=>TimeSpan.frommissions((20-i)*100));
var b=obs
.GetFullWindows(4,TimeSpan.FromSeconds(4.5));
b、 订阅(l=>l.Dump())//使用Linqpad
诀窍是使用带有重叠窗口功能的缓冲区
或窗口
<代码>窗口在这里工作得更好,因为如果满足计数标准,您可以将其短路