我将程序与以下代码一起作为我想要做的其他事情的简化版本:
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。
我误解了什么吗?有没有办法阻止组输出,直到观察到一个字符串?
答案 0 :(得分:1)
目前尚不清楚你在这里想要达到的目标。 Rx表现得如此。
Zip运算符的结果选择器正在捕获组流和字符串。请注意,它不会捕获组流的事件。
结果选择器运行时,组流已发送0
。在SelectMany
事件消失后,0
将订阅群组流。
只有当字符串是第一个发送的事件(将OnNext("even")
向上一行)时才会正常,因为该组在创建时将被订阅,这只是 < / em>在第一个事件发送到组之前。
GroupBy
运算符不会记住并重放历史事件,而且它的来源很热。