Получить одно наблюдаемое для списка объектов, содержащих наблюдаемые свойства?

Итак, у меня есть объект, который содержит наблюдаемое как свойство:

public class Tile
{
    ...

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

    ...
}

У меня также есть список плиток:

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

Теперь я хотел бы сделать один наблюдаемый для списка тайлов, поэтому есть событие, когда любой из типов тайлов изменяется (и наблюдаемый должен включать, какой тайл был), что-то вроде:

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

Это возможно? И если да, то как?


person The Oddler    schedule 19.01.2018    source источник


Ответы (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, я бы предложил использовать более реактивную структуру данных. ReactiveList из ReactiveUI должен работать, или какой-то наблюдаемый, чтобы обернуть изменения списка.

person Shlomo    schedule 19.01.2018
comment
Это работает нормально, список никогда не должен меняться. Поэтому я фактически изменил его на ReadOnlyCollection, чтобы отразить это (это проект Unity, поэтому я пока не могу использовать ImmutableArray :() Спасибо! - person The Oddler; 21.01.2018