Код и вопрос в коде (в комментариях):
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);
}
Можно ли как покрасивее?