【发布时间】:2019-07-28 05:35:15
【问题描述】:
我想合并 2 个 observables 并保持顺序(可能基于选择器)。我还想对 observable 的来源施加背压。
所以选择器会选择其中一个项目通过 observable 推进,而另一个项目也会等待另一个项目来比较。
Src1、Src2 和 Result 都是 IObservable<T> 类型。
Src1: { 1,3,6,8,9,10 }
Src2: { 2,4,5,7,11,12 }
Result: 1,2,3,4,5,6,7,8,9,10,11,12
Timeline:
Src1: -1---3----6------8----9-10
Src2: --2-----4---5-7----11---------12
Result: --1--2--3-4-5-6--7-8--9-10-11-12
- 在上面的示例中,src1 发出 '1' 并被阻塞,直到 src2 发出 这是第一项,“2”。
- 应用选择最小项目的选择器 从 src1 中选择项目。
- Src2 现在等待下一项(来自 src1)与其比较 当前项目 ('2')。
- 当 src1 发出下一项“3”时,再次运行选择,这 从 src2 中选择项目的时间。
- 重复此过程,直到其中一个可观察对象完成。然后,剩余的 observable 推送项目直到完成。
这可以通过现有的 .net Rx 方法实现吗?
编辑:注意 2 个源 observables 保证是有序的。
示例测试:
var source1 = new List<int>() { 1, 4, 6, 7, 8, 10, 14 }.AsEnumerable();
var source2 = new List<int>() { 2, 3, 5, 9, 11, 12, 13, 15 }.AsEnumerable();
var src1 = source1.ToObservable();
var src2 = source2.ToObservable();
var res = src1.SortedMerge(src2, (a, b) =>
{
if (a <= b)
return a;
else
return b;
});
res.Subscribe((x) => Console.Write($"{x}, "));
DesiredResult: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
【问题讨论】:
-
你是如何合并 observables 的?请给出你的代码。因为Merge 运算符不会按顺序等待源
-
@MohammadOmidvar - 这就是他的要求。
-
是的,我没有正确理解。那么,“现有的 .net Rx 方法”是指内置运算符还是完全有可能? @msauce4。因为有可能写出能够做到这一点的主题。
-
@MohammadOmidvar 我希望使用内置运算符的任何组合来实现,但如果这不可能,我对编写主题感到好奇。假设我们忽略了背压问题,那能做到吗?有点类似这个,stackoverflow.com/questions/50298555/…,问题。
标签: c# .net .net-core system.reactive