请注意:这是问题较早发布,但感兴趣的解决方案却有不同的情况.
Please Note: This is continuation of the question posted earlier but the solution of interest is of a different situation.
我试图多次调用各自返回IObservable的方法,但在SelectMany语句中返回的值是一个Task,因此下面的Subscribe语句无法编译.
I am trying to make multiple calls to the methods that each return IObservable but the values being returned back in the SelectMany statement is a Task and hence the following Subscribe statement does not compile.
这是代码段
var myWorkList = new List<MyWork> { new MyWork(),// MyWork.Execute(data) returns IObservable new MyWork() }.ToObservable(); var results = myService .GetData(accountId) .SelectMany(data => myWorkList.ForEachAsync(r => r.Execute(data)) .Subscribe(result => { Console.WriteLine($"Result Id: {result.Id}"); Console.WriteLine($"Result Status: {result.Pass}"); });推荐答案
您只想使用.SelectMany.试试这个:
You just want to use .SelectMany. Try this:
var myWorkList = new List<MyWork>() { new MyWork(), new MyWork() }.ToObservable(); var query = from data in myService.GetData(accountId) from myWork in myWorkList from result in myWork.Execute(data) select result; var results = query .Subscribe(result => { Console.WriteLine($"Result Id: {result.Id}"); Console.WriteLine($"Result Status: {result.Pass}"); });这是我的测试代码:
public static class myService { public static IObservable<MyData> GetData(int x) => Observable.Return(new MyData()); } public class MyWork { public virtual IObservable<MyResult> Execute(MyData data) { return from isMatch in IsMatch(data) where isMatch select new MyResult() { Id = 1, Pass = true }; } public IObservable<bool> IsMatch(MyData data) { return Observable.Return(true); } } public class MyResult { public int Id; public bool Pass; } public class MyData { }当我执行我得到这个:
Result Id: 1 Result Status: True Result Id: 1 Result Status: True
在对上一个问题的评论中,我建议将此作为代表列表进行.方法如下:
In the comments on your previous question I suggested doing this as a list of delegates. Here's how:
var myWorkList = new Func<MyData, IObservable<MyResult>>[] { md => new MyWork().Execute(md), md => new MyWork().Execute(md), }.ToObservable(); var query = from data in myService.GetData(accountId) from myWork in myWorkList from result in myWork(data) select result;您得到相同的结果.
更多推荐
Rx.Net:在SelectMany中调用多个IObservable
发布评论