Сопоставление одного наблюдаемого с другим наблюдаемым другого типа в UniRX

Я работаю в Unity на С#, используя плагин UniRX. Для тех, кто не знаком с ним, UniRX — это реализация расширения C# Reactive, перенесенного обратно в C# .Net 2 (это то, что Unity использует с версии 5.3.5). То, что я пытаюсь сделать, это взять данные из одного IObservable типа A, преобразовать их с помощью System.Func и автоматически опубликовать результат в новом IObservable типа B. Я написал несколько строк кода, чтобы сделать это, но я чувствую, что это должно быть что-то, что просто автоматически включается в расширение Reactive (но я просто не смог найти правильный метод для вызова в документации). Код, который я написал, выглядит следующим образом:

private class ObserverableBridge<TIn, TOut> {
    public ReactiveProperty<TOut> outStream;

    public ObserverableBridge(IObservable<TIn> input, System.Func<TIn, TOut> converter) {
        this.outStream = new ReactiveProperty<TOut>();
        input.Subscribe((inValue) => this.outStream.Value = converter(inValue));
    }
}

public static IObservable<TOut> Bridge<TIn, TOut>(this IObservable<TIn> a, System.Func<TIn, TOut> converter) {
    return new ObserverableBridge<TIn, TOut>(a, converter).outStream;
}

Который можно использовать следующим образом:

        ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
        IObservable <int> output = input.Bridge((inFloat) => Mathf.RoundToInt(inFloat));
        output.Subscribe((a) => { Debug.Log("a = " + a); });
        for(int i = 1; i<3; i++) {
            input.Value = i + 0.1f;
        }

И производит вывод, например:

a = 0
a = 1
a = 2

Что мне интересно, есть ли способ сделать это встроенным в Reactive Extension (мне кажется, что он должен быть), чтобы мне не нужно было использовать мою собственную систему Bridge.

Заранее спасибо за вашу помощь!


person David Reimer    schedule 05.06.2016    source источник


Ответы (1)


Попробуйте Select():

ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
input.Select<float, int>(Mathf.RoundToInt).Subscribe(a => Debug.LogFormat("a = {0}", a));
person Kevin Yockey    schedule 11.08.2016