我可以通过匹配键将两个序列配对在一起吗?

2023-12-27

假设序列一是访问网络以检索站点 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));

下面的测试给出了正确的结果。目前它只是采用整数,如果您使用带有键和值的数据,那么您需要按 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);

yields:

4:4
3:3
2:2
1:1
5:5

编辑回应布兰登:

对于项目属于不同类别(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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以通过匹配键将两个序列配对在一起吗? 的相关文章

随机推荐