我对以下重载感兴趣:
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();
文件说明:
包含最新源元素的列表
和
可观察序列,包含源的最新元素列表
但并没有真正提及订单。
答案 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运算符。 HERE是CombineLatest
的一个。