的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