Rx 动态大小的滑动缓冲区
Rx Dynamically Sized Sliding Buffer
我不太确定如何表达,所以如果我说错了,我很抱歉。
我有一系列事件,我们会说它看起来像这样:
0,1,2,3,4,5,6,7,8,9,...
我想为我的程序提供一个 IObservable,returns 缓冲区看起来像这样:
[0],[0,1],[0,1,2],[0,1,2,3],[1,2,3,4],[2,3,4, 5],[3,4,5,6],....
或其他一些不是 4 的最大缓冲区大小。如果我可以像您使用定时缓冲区调用一样输入缓冲区参数,那将很容易,但没有重载,所以我尝试构建手动顺序:
target.LogEvents.Buffer(1,1).Take(1).Concat(target.LogEvents.Buffer(2,1).Take(1)).Concat(target.LogEvents.Buffer(3,1).Take(1)).Concat(target.LogEvents.Buffer(4, 1)).Subscribe(...);
但这没有用。它给了我
[0],[1,2],[3,4,5],[6,7,8,9],[7,8,9,10],....
如何生成序列?
这对你有用吗?
IObservable<IEnumerable<int>> query =
source
.Scan(Enumerable.Empty<int>(), (a, x) =>
a.Concat(new [] { x }).TakeLast(4).ToList());
您需要 NuGet "Rx-Main" 和 "Ix-Main" 才能正常工作。
我不太确定如何表达,所以如果我说错了,我很抱歉。 我有一系列事件,我们会说它看起来像这样:
0,1,2,3,4,5,6,7,8,9,...
我想为我的程序提供一个 IObservable,returns 缓冲区看起来像这样:
[0],[0,1],[0,1,2],[0,1,2,3],[1,2,3,4],[2,3,4, 5],[3,4,5,6],....
或其他一些不是 4 的最大缓冲区大小。如果我可以像您使用定时缓冲区调用一样输入缓冲区参数,那将很容易,但没有重载,所以我尝试构建手动顺序:
target.LogEvents.Buffer(1,1).Take(1).Concat(target.LogEvents.Buffer(2,1).Take(1)).Concat(target.LogEvents.Buffer(3,1).Take(1)).Concat(target.LogEvents.Buffer(4, 1)).Subscribe(...);
但这没有用。它给了我
[0],[1,2],[3,4,5],[6,7,8,9],[7,8,9,10],....
如何生成序列?
这对你有用吗?
IObservable<IEnumerable<int>> query =
source
.Scan(Enumerable.Empty<int>(), (a, x) =>
a.Concat(new [] { x }).TakeLast(4).ToList());
您需要 NuGet "Rx-Main" 和 "Ix-Main" 才能正常工作。