使用比原始元素更多的元素创建ReactiveUI派生集合

Dan*_*eal 11 c# system.reactive reactiveui

是否可以创建一个ReactiveUI派生集合,其中包含的元素多于原始集合?

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

为了说明这一点,想象一下,试图获得一个派生的集合,代表每个遇阻交通堵塞的乘客

class Car 
{
    ReactiveCollection<Passenger> Passengers;
}

var TrafficJam=new ReactiveCollection<Car>();
EveryPassengerInTheTrafficJam=Cars.CreateDerivedCollection(c=>c.Passengers);
Run Code Online (Sandbox Code Playgroud)

以上不起作用,我认为无论如何IEnumerable<ReactiveCollection<Passenger>>都不能将错误转换为ReactiveCollection<Passenger>- 或类型的东西.

我无法弄清楚这种扁平化的正确方法 - 不可否认,我可能会在这里完全错误地咆哮,所以请告诉我是否有更好的方法来实现同样的目标!

Ana*_*tts 13

目前,CreateDerivedCollection不支持SelectMany作为转换,处理删除过于棘手.如果您没有多个项目,则可以每次都重新生成集合:

cars.Changed
    .Select(_ => cars.SelectMany(x => x.Passengers).ToList())
    .ToProperty(this, x => x.Passengers);
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我们走了:

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);
Run Code Online (Sandbox Code Playgroud)

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

  1. 当其中一名乘客换上车时
  2. 当其中一辆车改变时

然而,棘手的部分是,我们只想在集合中观察乘客的汽车(即如果汽车被拆除,我们不再关心其乘客).

正确跟踪自杀乘客

因此,奇怪的SelectMany的想法是,"每次汽车列表更改时,构建一个新的Observable列表,表示乘客收集何时更改,并将它们合并在一起".

但是,如果我们只有这个声明,我们将不得不等待一辆车被添加并且其乘客在我们获得新乘客名单之前发生变化,所以我们还必须在车辆列表也发生变化时进行更新.

什么是"单位"业务?

在这种情况下,我实际上并不关心这些Observable所发布的值,就在它们发生的时候."Unit"是void的Rx版本,它只有一个值"Unit.Default".当你只关心事情发生时,你使用它,而不是它的价值.