假设序列一出现在网上以检索站点1,2,3,4,5的内容(但将以不可预测的顺序返回).
序列二进入数据库以检索关于这些相同记录1,2,3,4,5的上下文(但是出于本示例的目的,将以不可预测的顺序返回).
是否有一个Rx扩展方法,当两个序列中的每个匹配对都准备就绪时,它们会将这些方法组合成一个序列?即,如果第一个序列以4,2,3,5,1的顺序返回,第二个序列以1,4,3,2,5的顺序返回,则合并的序列将是(4,4),(3 ,3),(2,2),(1,1),(5,5) - 每一对准备就绪.我看过Merge和Zip,但它们似乎并不是我正在寻找的.
我不想丢弃不匹配的对,我认为排除了一个简单的.Where.Select组合.
var paired = Observable
.Merge(aSource, bSource)
.GroupBy(i => i)
.SelectMany(g => g.Buffer(2).Take(1));
Run Code Online (Sandbox Code Playgroud)
下面的测试给出了正确的结果。目前它只是采用整数,如果您使用带有键和值的数据,那么您需要按 i.Key 而不是 i 进行分组。
var aSource = new Subject<int>();
var bSource = new Subject<int>();
paired.Subscribe(g => Console.WriteLine("{0}:{1}", g.ElementAt(0), g.ElementAt(1)));
aSource.OnNext(4);
bSource.OnNext(1);
aSource.OnNext(2);
bSource.OnNext(4);
aSource.OnNext(3);
bSource.OnNext(3);
aSource.OnNext(5);
bSource.OnNext(2);
aSource.OnNext(1);
bSource.OnNext(5);
Run Code Online (Sandbox Code Playgroud)
产量:
4:4
3:3
2:2
1:1
5:5
Run Code Online (Sandbox Code Playgroud)
编辑回应布兰登:
对于项目属于不同类别(A类和B类)的情况,可以进行如下调整。
using Pair = Tuple<AClass, BClass>;
var paired = Observable
.Merge(aSource.Select(a => new Pair(a, null)), bSource.Select(b => new Pair(null, b)))
.GroupBy(p => p.Item1 != null ? p.Item1.Key : p.Item2.Key)
.SelectMany(g => g.Buffer(2).Take(1))
.Select(g => new Pair(
g.ElementAt(0).Item1 ?? g.ElementAt(1).Item1,
g.ElementAt(0).Item2 ?? g.ElementAt(1).Item2));
Run Code Online (Sandbox Code Playgroud)