Reactive -- как обработать множество и вернуть единый резуль
От: Аноним  
Дата: 24.01.12 08:22
Оценка:
Код и вопрос в коде (в комментариях):

class Program
    {
        static void Main(string[] args)
        {
            var result = from elements in GetElements()
                         from unused1 in ProcessElements(elements)
                         from unused2 in SingleRequest()
                         select new Unit();

            result.Subscribe();
        }

        public static IObservable<List<string>> GetElements()
        {
            return Observable.Return(new List<string> { "1", "2", "3" });
        }

        // Как изменить этот метод, чтобы он для каждого элемента вызвал ProcessElement()
        // и вернул один результат IObservable<Unit> (не множество)???
        // Важно! Нельзя использовать Last, First, Single (в Silverlight не работает).
        // SingleRequest должен вызываться независимо от количества элементов 1 раз.
        private static IObservable<Unit> ProcessElements(List<string> elements)
        {
            return from element in elements.ToObservable()
                   from unused in ProcessElement(element)
                   select new Unit();
        }

        private static IObservable<Unit> ProcessElement(string element)
        {
            return Observable.Start(() => Console.WriteLine("Элемент " + element + " обработан."));
        }

        private static IObservable<Unit> SingleRequest()
        {
            return Observable.Start(() => Console.WriteLine("single"));
        }
    }


То есть сейчас выдача такая:


Элемент 1 обработан.
single
Элемент 2 обработан.
Элемент 3 обработан.
single
single


А должна быть такая:

Элемент 1 обработан.
Элемент 2 обработан.
Элемент 3 обработан.
single


Идея есть только с применением Skip:

private static IObservable<Unit> ProcessElements(List<string> elements)
        {
            if (0 == elements.Count)
                return Observable.Return(new Unit());

            return (from element in elements.ToObservable()
                    from unused in ProcessElement(element)
                    select new Unit()).Skip(elements.Count - 1);
        }


Можно ли как покрасивее?
Re: Reactive -- как обработать множество и вернуть единый ре
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.01.12 09:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно ли как покрасивее?


Aggregate?

А ты объясни что нужно сделать.
Re[2]: Reactive -- как обработать множество и вернуть единый
От: Аноним  
Дата: 24.01.12 09:15
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Aggregate?

G>А ты объясни что нужно сделать.

Правильно, спасибо.

Нужно по очереди делать асинхронные запросы к серверу. Причем один из запросов нужно делать много раз, для каждого из элементов предыдущего запроса. А следующие за ним делать единожды. По этому нужно применить Aggregate после множественного запроса.