Recursion/Fan-OutinReactiveExtensions提供包含公司信息的资料我查询各种数据源以获取可能相关的公司资料,所有这些都是并行的。我将其合并到公司简介IObservable中。当我取回这些可能相关的配置文件时,我将它们与我已经观察到的配置文件进行比较,如果它们的相关性>80%并且与我已经观察到的任何配置文件不同,我认为它们是匹配的。我想将匹配公司反馈回第1步,以便我可以搜索这些新的匹配配置文件的相关数据。我使用一些已知的良好配置文件来引导该过程。最终,没有看到更多匹配的配置文件,因此该过程结束。我在编程时遇到问题。如果我使用Subject允许管道的尾端将其配置文件发送到工作流的开头,则没有人调用OnCompleted并且我永远不会发现该过程已经结束。如果我用递归开发它,我似乎总是以堆栈溢出结束,因为我试图用它自己的返回值调用一个函数。谁能帮我完成这个任务,我可以确定这个过程已经结束了吗?听起来您想要这样的数据流:种子配置文件-->来源-->关联-->输出^||v-这似乎是解决一般问题比解决特定问题更容易或更容易的情况,所以我将提出一个通用的“反馈”功能,它应该为您提供所需的构建块:编辑:修复功能doneIObservableFeedback(thisIObservableseed,Funcproduce,Func>feed){returnObservable.Create(obs=>{varret=newCompositeDisposable();ActionpartComplete=d=>{ret.Remove(d);if(ret.Count==0)obs.OnCompleted();};Action,Action>ssub=(o,n)=>{vardisp=newSingleAssignmentDisposable();ret.Add(disp);disp.Disposable=o.Subscribe(n,obs.OnError,()=>partComplete(disp));};动作>rsub=(o,n)=>{vardisp=newSingleAssignmentDisposable();ret.Add(disp);disp.Disposable=o.Subscribe(n,obs.OnError,()=>partComplete(disp));};动作recurse=null;recurse=s=>{rsub(produce(s),r=>{obs.OnNext(r);ssub(feed(r),recurse);});};ssub(seed,recurse);returnret;});在你的情况下T和TResult似乎是相同的,所以feed将是身份函数。produce将是用于实现步骤2和3的函数。我测试了该函数的一些示例代码:以上是C#学习教程:Recursion/FanoutinReactiveExtensions的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注--voidMain(){varseed=newint[]{1,2,3,4,5,6};varfound=newHashSet();varmults=seed.ToObservable().Feedback(i=>{returnObservable.Range(0,5).Select(r=>r*i).TakeWhile(v=>vfound.Add(v));},i=>Observable.Return(i));使用(vardisp=mults.Dump()){Console.WriteLine("按任意键停止");控制台.ReadKey();}Console.WriteLine("按任意键退出");控制台.ReadKey();}staticIDisposableDump(thisIObservablesource){returnsource.Subscribe(item=>Console.WriteLine(item),ex=>Console.WriteLine("Erroroccurredindumpobservable:"+ex.ToString()),()=>Console.WriteLine("转储完成"));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
