gpt4 book ai didi

c# - 创建一个包含比原始元素更多的 ReactiveUI 派生集合

转载 作者:可可西里 更新时间:2023-11-01 08:42:02 32 4
gpt4 key购买 nike

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

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

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

class Car 
{
ReactiveCollection<Passenger> Passengers;
}

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

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

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

最佳答案

目前,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 中的想法是,“每次汽车列表发生变化时,构建一个新的 Observables 列表来表示乘客集合何时发生变化,并将它们合并在一起”。

但是,如果我们有那个语句,我们将不得不等待添加汽车并且它的乘客发生变化,然后我们才能得到新的乘客列表,所以我们还必须在汽车列表发生变化时进行更新。

这个“单位”业务是什么?

在这种情况下,我实际上并不关心这些 Observable 输出的值,只关心它们发生的时间。 “Unit”是 void 的 Rx 版本,它只有一个值,“Unit.Default”。当您只关心某事何时发生而不关心它的值(value)时,您可以使用它。

关于c# - 创建一个包含比原始元素更多的 ReactiveUI 派生集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254708/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com