眼下,CreateDerivedCollection
不支持SelectMany
作为一种转换,处理删除变得太棘手。如果你没有很多项目,你可以每次都重新生成集合:
cars.Changed
.Select(_ => cars.SelectMany(x => x.Passengers).ToList())
.ToProperty(this, x => x.Passengers);
Edit:好吧,我们开始吧:
var whenCarsOrPassengersInThoseCarsChange = Observable.Merge(
cars.Changed
.SelectMany(_ =>
cars.Select(x => x.Passengers.Changed).Merge())
.Select(_ => Unit.Default),
cars.Changed.Select(_ => Unit.Default));
whenCarsOrPassengersInThoseCarsChange.StartWith(Unit.Default)
.Select(_ => cars.SelectMany(x => x.Passengers).ToList())
.ToProperty(this, x => x.Passengers);
因此,当我们想要重新评估乘客列表时,我们有两种主要情况:
- 当其中一名乘客在车厢内换车时
- 当其中一辆车发生变化时
然而,棘手的部分是,我们只想观察乘客是否有集合中的汽车(即,如果一辆车被移走,我们就不再关心它的乘客)。
正确追踪自杀乘客
所以,那个奇怪的 SelectMany 的想法是,“每次汽车列表发生变化时,构建一个新的 Observables 列表来表示乘客集合何时发生变化,并将它们全部合并在一起”。
然而,如果我们only有了这个声明,我们就必须等待添加汽车and在我们获得新的乘客列表之前,其乘客发生了变化,因此当汽车列表也发生变化时,我们也必须进行更新。
这个“单位”业务是什么?
在这种情况下,我实际上并不关心这些可观察到的值,只关心它们发生时的值。 “Unit”是 void 的 Rx 版本,它只有一个值“Unit.Default”。当您只关心某件事发生时,而不关心它的价值时,您可以使用它。