使用linq或rx组合两个数字流
我在玩linq/rx,想做一些简单的事情,创建一个监听两个不同数字流的流,当其中一个数字流得到一个新值时,输出总和 我尝试了以下方法:使用linq或rx组合两个数字流,linq,system.reactive,Linq,System.reactive,我在玩linq/rx,想做一些简单的事情,创建一个监听两个不同数字流的流,当其中一个数字流得到一个新值时,输出总和 我尝试了以下方法: static void Main(string[] args) { var numSrcA = new Subject<int>(); var numSrcB = new Subject<int>(); var resultsLinq = from a in numSrcA
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: 5
Rx: 5
尽管看起来只有当numSrcB获得一个新值时才会计算新的和(在这种情况下,它将新值与numSrcA中的所有现有值相加)
是否可以更改此选项,以便对任一numSrc进行加法运算,从而重新计算总和?简短回答,您需要一个组合器,该组合器不需要在所有流上进行新输入即可触发结果计算-换句话说,您需要
combinelatetest
:
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
简而言之,您需要一个组合器,该组合器不需要在所有流上输入新的数据来触发结果的计算-换句话说,您需要
combinelatetest
:
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