使用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

我在玩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: 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