11

是否可以创建一个包含比原始元素更多的 ReactiveUI 派生集合?

我已经看到有一种过滤集合和选择单个属性的方法,但我正在寻找的是等效于可枚举的 SelectMany 操作。

为了说明这一点,想象一下试图获得一个派生集合,该集合代表陷入交通拥堵的每位乘客。

class Car 
{
    ReactiveCollection<Passenger> Passengers;
}

var TrafficJam=new ReactiveCollection<Car>();
EveryPassengerInTheTrafficJam=Cars.CreateDerivedCollection(c=>c.Passengers);

以上不起作用,我认为错误IEnumerable<ReactiveCollection<Passenger>>不能被强制转换为ReactiveCollection<Passenger>- 或者与类型有关的东西,无论如何。

我无法找出这种扁平化的正确方法 - 诚然,我可能在这里完全错误地吠叫,所以如果有更好的方法来实现同样的事情,请告诉我!

4

2 回答 2

13

目前,CreateDerivedCollection不支持SelectMany作为转换,它太棘手而无法处理删除。如果您没有很多项目,您可以每次重新生成集合:

cars.Changed
    .Select(_ => cars.SelectMany(x => x.Passengers).ToList())
    .ToProperty(this, x => x.Passengers);

编辑:好的,我们开始:

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);

因此,我们的想法是,当我们想要重新评估乘客列表时,我们有两种主要情况:

  1. 当其中一名乘客换车时
  2. 当其中一辆车发生变化时

然而,棘手的部分是,我们只想查看集合中汽车的乘客(即如果汽车被移除,我们不再关心它的乘客)。

正确追踪自杀乘客

所以,那个奇怪的 SelectMany 的想法是,“每次汽车列表发生变化时,构建一个新的 Observable 列表来表示乘客集合何时发生变化,并将它们合并在一起”。

但是,如果我们只有该语句,我们将不得不等待添加汽车并且其乘客发生变化,然后才能获得新的乘客列表,因此我们还必须在汽车列表发生变化时进行更新。

这是什么“单位”业务?

在这种情况下,我实际上并不关心这些 Observable 输出的值,只是它们发生时。“Unit”是 void 的 Rx 版本,它只有一个值,“Unit.Default”。当你只关心事情发生时,你会使用它,而不是它的价值是什么。

于 2013-03-07T01:10:32.353 回答
2

嗯......我对 ReactiveUI 不是很熟悉,但只是通过阅读,看起来你需要改变你的SelectMany去向:

var jam = cars.SelectMany(x => x.Passengers).CreateDerivedCollection(p => p);
于 2013-03-06T22:29:03.227 回答