gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:04:21 26 4
gpt4 key购买 nike

我对以下重载感兴趣:

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() .因此输出列表中的顺序将与输入中的顺序相同。

关于c# - CombineLatest 是否保留了可观察量的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35104570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com