CombineLatest是否保留了可观察量的顺序?

时间:2016-01-30 17:11:10

标签: c# .net system.reactive reactive-programming

我对以下重载感兴趣:

public static IObservable<IList<TSource>> CombineLatest<TSource>(this params IObservable<TSource>[] sources);
public static IObservable<IList<TSource>> CombineLatest<TSource>(this IEnumerable<IObservable<TSource>> sources);

结果列表中元素的顺序是否保证与输入中的顺序相同?

例如,在以下代码中,list[0]始终包含来自alist[1]的元素b中的元素?

IObservable<int> a = ...;
IObservable<int> b = ...;
var list = await Observable.CombineLatest(a, b).FirstAsync();

文件说明:

  

包含最新源元素的列表

  

可观察序列,包含源的最新元素列表

但并没有真正提及订单。

2 个答案:

答案 0 :(得分:3)

订单是守旧的。

当你查看source code of RX时,一切都归结为In [17]: df[['lastname', 'firstname', 'middle initial']] = df['name'].str.split(expand=True) df Out[17]: name lastname firstname middle initial index 0 ALLEN PHILLIP K ALLEN PHILLIP K 1 BADUM JAMES P BADUM JAMES P 2 BANNANTINE JAMES M BANNANTINE JAMES M 8 BELFER ROBERT BELFER ROBERT None 类。

你可以在那里找到为每个输入observable创建一个索引观察者(其中索引是输入中的顺序):

System.Reactive.Linq.CombineLatest<TSource, TResult>

生成的元素按如下方式生成:

for (int i = 0; i < N; i++)
{
    var j = i;

    var d = new SingleAssignmentDisposable();
    _subscriptions[j] = d;

    var o = new O(this, j);
    d.Disposable = srcs[j].SubscribeSafe(o);
}

我感兴趣的重载private void OnNext(int index, TSource value) { lock (_gate) { _values[index] = value; _hasValue[index] = true; if (_hasValueAll || (_hasValueAll = _hasValue.All(Stubs<bool>.I))) { /* snip */ res = _parent._resultSelector(new ReadOnlyCollection<TSource>(_values)); /* snip */ _observer.OnNext(res); } /* snip */ } } 只是_resultSelector。因此,输出列表中的顺序将与输入中的顺序相同。

答案 1 :(得分:0)

当有一个元素被推送到所有流时,

CombineLatest首先触发。

之后,只要将新元素推送到任何流,它就会触发。

因此,如果您“合并”两个流,结果列表中总会有两个元素,据我所知,它保证订单与您在CombineLatest中为流提供的顺序相同参数。

您可以使用大理石图可视化Rx运算符。 HERECombineLatest的一个。