这是一个简短的问题。我有一个 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;
}
然后您可以使用 DistinctUntilChanged
在 IsReady
谓词从 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/