Реактивные расширения Тема <IEnumerable <Obj>> - Тема <IEnumerable <AggregatedObj>> - PullRequest
0 голосов
/ 03 июня 2011

У меня проблемы с взятием предмета

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, но я считаю, что это возможно, оставаясь более реактивным?

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Как насчет:

PersonDataSubject
    .GroupBy(x => x.Dob.Year)
    .Select(x => x.Aggregate(new List<BornInYear>(), (acc, x) => { acc.Add(new BornInYear { Year = ps.Key }); return acc; }))
0 голосов
/ 06 июня 2011

Хорошо, это работает.Спасибо за идеи, ребята - ответ кажется поразительно очевидным задним числом

...