c# - 使用 RX 跟踪可观察集合中的多个项目

标签 c# system.reactive

这是一个简短的问题。我有一个 ObservableCollection<IItem>其中 IItem有一个名为 Id 的属性。在应用程序的整个生命周期中,项目都会被添加、删除,然后再次重新添加到该集合中。 我需要的是跟踪此集合中何时出现具有特定 ID 的项目。当所有必需的依赖项都存在时,我需要进行一些初始化,如果至少删除了一个必需的项目,那么我需要进行清理。如果该项目再次重新添加,那么我需要再次进行初始化。 对使用什么 RX 运算符来构建此类查询有什么建议吗?

最佳答案

跟踪集合的状态可能会有些乏味。除非您的集合非常大,否则您可以在每次更改时检查集合以确定是否满足初始化条件。然后你可以使用 DistinctUntilChanged 来获得一个在你需要执行初始化和清理时触发的 observable

这是一个例子:

var collection = new ObservableCollection<Int32>();
var observable = Observable
  .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
    handler => collection.CollectionChanged += handler,
    handler => collection.CollectionChanged -= handler
  );

然后您需要一个谓词来确定是否需要初始化(集合“已准备好”)。如果您的集合很大,这个谓词可能会变得很昂贵,因为每次更改集合时都会调用它,但我的假设是这不是问题。

Boolean IsReady(IEnumerable<Int32> items, IReadOnlyList<Int32> itemsRequiredToBeReady) {
  return items.Intersect(itemsRequiredToBeReady).Count() == itemsRequiredToBeReady.Count;
}

然后您可以使用 DistinctUntilChangedIsReady 谓词从 true 变为 false 时获取通知,反之亦然:

var isReadyObservable = observable
  .Select(ep => IsReady((ObservableCollection<Int32>) ep.Sender, ItemsRequiredToBeReady))
  .DistinctUntilChanged();

要初始化和清理你需要两个订阅:

isReadyObservable.Where(isReady => isReady).Subscribe(_ => Initialize());
isReadyObservable.Where(isReady => !isReady).Subscribe(_ => Cleanup());

关于c# - 使用 RX 跟踪可观察集合中的多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25015375/

相关文章:

c# - 不能使用 lambda 表达式作为动态调度的参数

c# - react 性扩展 : Process events in batches + add delay between every batch

c# - 如何将 Observable 值路由到不同的订阅者?

c# - 如何在 C# 中的 <seealso> 标记中为方法重载创建 cref?

c# - 通过HTTP访问WCF服务

c# - 围绕 SqlTransaction 回滚的异常处理

c# - 结合 boolean Observables

c# - InvokeMethod 可以用作可选参数吗?

c# - 响应式框架 (RX) 和异步处理事件

c# - Cron 可观察序列