У меня есть набор наблюдаемых, которые генерируют изменения состояния для так называемого канала
. И у меня есть 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, но я не могу понять, как это сделать.