获取包含可观察属性的对象列表的单个observable?

时间:2018-01-19 18:41:30

标签: c# system.reactive rx.net

所以我有一个包含observable作为属性的对象:

public class Tile
{
    ...

    private BehaviorSubject<TileType> _type;
    public IObservable<TileType> TypeChanged
    {
        get { return _type.AsObservable(); }
    }

    ...
}

我还有一个Tiles列表:

public List<Tile> Tiles { get; } = new List<Tile>();

现在我想为瓦片列表制作一个单一的可观察对象,所以当有任何瓦片时会发生一个事件。类型更改(并且observable应该包括它是哪个tile),类似于:

public IObservable<Tile, TileType> TileTypeChanged { get; } = what?

这可能吗? 如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

如果Tiles是静态列表,那么这将起作用:

List<Tile> Tiles = new List<Tile>
{
    //Notifications from these Tiles will be included in TileTypeChanged
};

IObservable<(Tile, TileType)> TileTypeChanged = Tiles
    .Select(t => t.TypeChanged.Select(tt => (t, tt)))
    .Merge();

var willNotBeIncluded = new Tile();     //The notifications from this Tile 
Tiles.Add(willNotBeIncluded);           //will not be included in TileTypeChanged

如果您希望新添加的项目包含在TileTypeChanged父观察中,那么我建议使用更具反应性的数据结构。来自ReactiveUI的ReactiveList应该可以工作,或者某种可观察来包装列表更改。