Как динамически объединить n наблюдаемых в список?

У меня есть набор наблюдаемых, которые генерируют изменения состояния для так называемого канала . И у меня есть ChannelSet , который должен контролировать эти каналы.

Я хотел бы написать что-то вроде этого: если один канал работает, канал установлен, иначе набор каналов не работает.

IEnumerable<ChannelState> channelStates = ...;
if (channelStates.Any(cs => cs == ChannelState.Operational))
    channelSet.ChannelSetState = ChannelSetState.Up;
else
    channelSet.ChannelSetState = ChannelSetState.Down;

Но где мне взять мой IEnumerable ? Если у меня есть 1 канал, я могу просто подписаться на изменения его состояния и соответствующим образом изменить состояние установленного канала. Для двух каналов я мог бы использовать CombineLatest :

Observable.CombineLatest(channel0States, channel1States, (cs0, cs1) =>
    {
        if (cs0 == ChannelSetState.Up || cs1 == ChannelSetState.Up)
            return ChannelSetState.Up;
        else
            return ChannelSetState.Down;
    });

Но у меня есть IEnumerable и соответствующий IEnumerable > . Я ищу что-то вроде CombineLatest , которое не ограничено фиксированным числом наблюдаемых.

Чтобы усложнить ситуацию, можно добавлять и удалять набор каналов. Так что время от времени, например, будет добавлен канал. Новый канал также генерирует изменения состояния, которые необходимо включить.

Итак, на самом деле я ищу функцию:

IEnumerable<IObservable<ChannelState>> --> IObservable<ChannelSetState>

, которая поддерживает актуальность при изменении входных данных. Должен быть какой-то способ добиться этого с помощью Rx, но я не могу понять, как это сделать.

6
задан Ronald Wildenberg 25 July 2011 в 07:34
поделиться