将列表中的 属性 组合为单个可观察对象的反应式方法

Reactive method to combine property in list to single observable

我们正在努力寻找一种合适的方法来将元素列表中的 属性 值组合成单个可观察元素。这是一些示例代码(已简化):

public class Result {
  public ISubject<bool> Completed { get; }
}

public void SignalWhenAllIsDone(){
  List<Result> list = GetListOfResults(); //not important

  // somehow merge the list and the Completed property into a single observable
  IObservable<bool> allCompleted = ???;

  allCompleted.Subscribe(x => {
    Console.WriteLine("all results have completed");
  });  
}

我们认为反应式工具箱中有一些神奇之处,可以订阅所有 Completed 主题并将其 merge/evaluate/condense 订阅到我们可以使用的单个可观察对象中。我们一直在做一些手工簿记,但我们的直觉告诉我们,这是反应式可以帮助的事情。

有什么帮助吗?

几乎所有用于组合 Observable 的扩展方法都提供了一个重载,它们采用 IEnumerable>。这应该符合您的要求:

IObservable<bool> allCompleted = Observable.CombineLatest(
              list.Select(res => res.Completed),
              completedValuesList => completedValuesList.All(isCompleted => isCompleted);

作为此答案的扩展,我想通知您有关 DynamicData 的信息。有了这个,您还可以针对特殊列表编写查询,即使列表发生变化,它也会为您提供有效的 allCompleted-Observable。