У меня проблемы с взятием предмета
public Subject<IEnumerable<Person>> PersonDataSubject;
И преобразовать его в:
public Subject<IEnumerable<BornInYear>> BornInYearSubject;
... используя некоторое агрегирование linq.
В приведенном ниже примере это рассматривается в более широком контексте, и я пытаюсь понять, как получить IEnumerable в объект BornInYearSubject из подписки на PersonDataSubject.
Что бы я ни пытался, я получаю IObservable<BornInYear>
, а не IObservable<IEnumerable<BornInYear>>
.
Цель состоит в том, чтобы клиенты этого класса могли подписаться на обе темы и получать IEnumerable соответствующего типа при каждом следующем уведомлении.
public class ReactiveTest
{
public class Person
{
public string name;
public DateTime dob;
};
public class BornInYear
{
public int Year;
public int Count;
}
public Subject<IEnumerable<Person>> PersonDataSubject = new Subject<IEnumerable<Person>>();
public Subject<IEnumerable<BornInYear>> BornInYearSubject= new Subject<IEnumerable<BornInYear>>();
public void LoadData()
{
// Go to hypotheritical web service and get batch of people.
IEnumerable<Person> people = WebService.Fetch();
// Notify subscribers we have a fresh batch of data.
PersonDataSubject.OnNext(people);
}
public ReactiveTest()
{
// Hookup BornInYearSubject to listen to PersonDataSubject and publish the summarised data.
PersonDataSubject.Subscribe(pd => pd.GroupBy(p => p.dob.Year)
.Select(ps => new BornInYear { Year = ps.Key, Count = ps.Count()})
.AsParallel()
);
// How do I get the results of this out and published onto BornInYearSubject?
}
}
Теперь я знаю, что мог бы добиться этого, используя Task.Factory.StartNew(...)...
в качестве подписчика OnNext для PersonDataSubject, но я считаю, что это возможно, оставаясь более реактивным?