我正在使用linq / rx并希望做一些简单的事情,创建一个流来监听两个不同的数字流,当任一数字流获得一个新值时,输出总和。
我尝试了以下内容:
static void Main(string[] args)
{
var numSrcA = new Subject<int>();
var numSrcB = new Subject<int>();
var resultsLinq = from a in numSrcA
from b in numSrcB
select a + b;
var resultsRx = numSrcA.SelectMany(a => numSrcB, (a, b) => a + b);
resultsLinq.Subscribe(r => Console.WriteLine("Linq: " + r));
resultsRx.Subscribe(r => Console.WriteLine("Rx: " + r));
numSrcA.OnNext(1);
numSrcB.OnNext(2);
numSrcA.OnNext(3);
Console.ReadLine();
}
输出:
Linq: 3
Rx: 3
我在期待:
Linq: 3
Rx: 3
Linq: 5
Rx: 5
虽然似乎只有当numSrcB获得一个新值时才会计算新的总和(在这种情况下,它会将该值与numSrcA中的所有现有值相加)。
是否可以更改,以便添加到numSrc中将重新计算总和?
答案 0 :(得分:1)
简短回答,你想要一个不需要所有流上的新输入的组合子来触发对结果的评估 - 换句话说,你想要CombineLatest
:
var resultsLinq2 = Observable.CombineLatest(numSrcA, numSrcB, (a,b) => a+b);
resultsLinq2.Subscribe(r => Console.WriteLine("Linq2: " + r));
结果:
Linq2: 3
Linq: 3
Rx: 3
Linq2: 5