gpt4 book ai didi

system.reactive - 我可以通过匹配键将两个序列配对吗?

转载 作者:行者123 更新时间:2023-12-04 20:13:10 24 4
gpt4 key购买 nike

假设序列 1 将访问网络以检索站点 1、2、3、4、5 的内容(但将以不可预测的顺序返回)。

序列 2 将转到数据库以检索有关这些相同记录 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);

产量:
4:4
3:3
2:2
1:1
5:5

编辑回应布兰登:

对于item为不同class(AClass和BClass)的情况,可以做如下调整。
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));

关于system.reactive - 我可以通过匹配键将两个序列配对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15070721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com