其他分享
首页 > 其他分享> > 的CombineLatest保留可观察的顺序吗?

的CombineLatest保留可观察的顺序吗?

作者:互联网

我对以下重载感兴趣:

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]总是包含a的元素,list [1]总是b的元素?

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

文档指出:

a list with the latest source elements

和:

observable sequence containing lists of the latest elements of the sources

但并没有真正提及订单.

解决方法:

顺序是保守的.

当您查看source code of RX时,所有内容都归结为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只是一个Enumerable.ToList().因此,输出列表中的顺序将与输入中的顺序相同.

标签:system-reactive,reactive-programming,c,net
来源: https://codeday.me/bug/20191119/2033527.html