首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Subject<IEnumerable<AggregatedObj>>的反应式扩展Subject<IEnumerable<Obj>>

对Subject<IEnumerable<AggregatedObj>>的反应式扩展Subject<IEnumerable<Obj>>
EN

Stack Overflow用户
提问于 2011-06-04 01:03:12
回答 2查看 318关注 0票数 0

我很难接受一个主题

代码语言:javascript
复制
public Subject<IEnumerable<Person>> PersonDataSubject;

并将其转换为:

代码语言:javascript
复制
public Subject<IEnumerable<BornInYear>> BornInYearSubject;

..。使用一些linq聚合。

下面的例子将它放在了更多的上下文中,而我正在努力解决的是如何从对PersonDataSubject的订阅中获得一个IEnumerable到BornInYearSubject中。

不管我怎么尝试,我最终得到的都是IObservable<BornInYear>,而不是IObservable<IEnumerable<BornInYear>>

目标是让类的客户端能够订阅这两个主题,并在每次“下一步”通知时获得相应类型的IEnumerable。

代码语言:javascript
复制
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(...)...作为我的PersonDataSubject订阅OnNext来实现这一点,但我相信这肯定是可能的,保持更多的反应?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-06 20:23:28

好的,这行得通。谢谢你的点子,伙计们--事后看来,答案似乎非常明显!

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;

namespace TestReactive
{
    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()
        {
            IEnumerable<Person> people = new List<Person> {
                new Person() {name = "Bill", dob = DateTime.Now.AddYears(-10)},
                new Person() {name = "Pete", dob = DateTime.Now.AddYears(-5)},
                new Person() {name = "Judy", dob = DateTime.Now.AddYears(-1)},
                new Person() {name = "Mike", dob = DateTime.Now.AddYears(-5)},
                new Person() {name = "Jake", dob = DateTime.Now.AddYears(-5)},
                new Person() {name = "Fred", dob = DateTime.Now.AddYears(-13)},
            };

            // Notify subscribers we have a fresh batch of data.
            PersonDataSubject.OnNext(people);
        }

        public ReactiveTest()
        {
            var subj = PersonDataSubject.Select(pds => pds.GroupBy(pd => pd.dob.Year)
                                                          .Select(p => new BornInYear {
                                                              Year = p.Key, Count = p.Count()
                                                          }).AsParallel());
            subj.Subscribe(BornInYearSubject);  

            BornInYearSubject.Subscribe( x=> Console.WriteLine("{0}", x.Count()));
            LoadData();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ReactiveTest rt = new ReactiveTest();
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2011-06-04 02:08:18

这样如何:

代码语言:javascript
复制
PersonDataSubject
    .GroupBy(x => x.Dob.Year)
    .Select(x => x.Aggregate(new List<BornInYear>(), (acc, x) => { acc.Add(new BornInYear { Year = ps.Key }); return acc; }))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6230272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档