RX - 拉链与组不按预期行事 - 可能的错误?

时间:2013-12-06 14:09:29

标签: c# system.reactive

我将程序与以下代码一起作为我想要做的其他事情的简化版本:

Subject<int> numbers = new Subject<int>();
Subject<string> strings = new Subject<string>();
var oddsAndEvens = numbers.GroupBy(i => i % 2);

var zipped = oddsAndEvens.Zip(strings, 
    (group, str) => group.Select(
        i => new Tuple<int, string>(i, str)))
        .SelectMany(x => x);
zipped.Subscribe(t => Console.WriteLine("{0}, {1}", t.Item1, t.Item2));

numbers.OnNext(0);
strings.OnNext("even");
numbers.OnNext(2);

strings.OnNext("odd");
numbers.OnNext(1);
numbers.OnNext(3);

Console.ReadKey();

程序的输出是

2, even
1, odd
3, odd

而我希望输出为

0, even
2, even
1, odd
3, odd 

我认为正在发生的事情是观察0并创建一个组。在观察到一个字符串之前,每个组都不能输出任何值(并且这两个字符串被压缩在一起),但是在观察到第一个字符串时,数字0已经过去了。如果我正确理解了RX,那么在订阅它之前,该组不应输出数字0。

我误解了什么吗?有没有办法阻止组输出,直到观察到一个字符串?

1 个答案:

答案 0 :(得分:1)

目前尚不清楚你在这里想要达到的目标。 Rx表现得如此。

Zip运算符的结果选择器正在捕获组流和字符串。请注意,它不会捕获组流的事件。

结果选择器运行时,组流已发送0。在SelectMany事件消失后,0将订阅群组流。

只有当字符串是第一个发送的事件(将OnNext("even")向上一行)时才会正常,因为该组在创建时将被订阅,这只是 < / em>在第一个事件发送到组之前。

GroupBy运算符不会记住并重放历史事件,而且它的来源很热。