使用linq或rx组合两个数字流

时间:2013-04-18 21:04:15

标签: 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
                      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中将重新计算总和?

1 个答案:

答案 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