C# 这是一种看待LINQ的新方法?嗯,对我来说,使用LINQ来消费可观测物似乎很奇怪?我一开始写的时候,用OnNext语句感觉自然多了。这似乎是不必要的复杂。。。例如,我有一个树状结构,在某些节点上有不同类型的子树。我将有四个嵌套的from语句,但无法返回所有

C# 这是一种看待LINQ的新方法?嗯,对我来说,使用LINQ来消费可观测物似乎很奇怪?我一开始写的时候,用OnNext语句感觉自然多了。这似乎是不必要的复杂。。。例如,我有一个树状结构,在某些节点上有不同类型的子树。我将有四个嵌套的from语句,但无法返回所有,c#,system.reactive,C#,System.reactive,这是一种看待LINQ的新方法?嗯,对我来说,使用LINQ来消费可观测物似乎很奇怪?我一开始写的时候,用OnNext语句感觉自然多了。这似乎是不必要的复杂。。。例如,我有一个树状结构,在某些节点上有不同类型的子树。我将有四个嵌套的from语句,但无法返回所有数据,因为select只返回一个对象。除非我对返回的列表进行合并。。。我已经恢复到使用递归函数的简单IEnumerable,我想我还没有找到Rx的真正用例…@Diana-一般来说,你不应该调用OnNext-如果你这样做,你可能做错了什么。我想你


这是一种看待LINQ的新方法?嗯,对我来说,使用LINQ来消费可观测物似乎很奇怪?我一开始写的时候,用OnNext语句感觉自然多了。这似乎是不必要的复杂。。。例如,我有一个树状结构,在某些节点上有不同类型的子树。我将有四个嵌套的from语句,但无法返回所有数据,因为select只返回一个对象。除非我对返回的列表进行合并。。。我已经恢复到使用递归函数的简单IEnumerable,我想我还没有找到Rx的真正用例…@Diana-一般来说,你不应该调用
OnNext
-如果你这样做,你可能做错了什么。我想你会发现,LINQ的概念有点错误。LINQ只是一种查询语言,只要实现了正确的方法,它就可以应用于任何一组对象。基于
IEnumerable
&IQueryable`的LINQ是众所周知的,但基于
IObservable
的LINQ不太为人所知,但我不会称之为“使用LINQ消费可观察对象”。LINQ只是一种处理可观察对象的方法,就像处理可枚举对象一样。@Diana-我还认为,如果有四个嵌套的from语句,LINQ版本将比使用扩展方法干净得多。
    [TestMethod]
    public void TODO2()
    {
        string result = "";
        Calculate2().Subscribe(r => result += r.Result);

        Assert.AreEqual("do1do2do3do1", result);
        // PASSES
    }

    public IObservable<ResultWithProgress<string>> Calculate2()
    {
        return Observable.Create<ResultWithProgress<string>>(obs =>
        {
            Action<int, string, string> report = (pv, r, pt) =>
            {
                obs.OnNext(new ResultWithProgress<string>()
                {
                    Progress = pv,
                    Result = r,
                    ProgressText = pt,
                });
            };

            var query =
                from result1 in Observable.Start(() => Do1()) // Just returns string "do1"
                    .Do(x => report(25, x, "Completed Task1"))
                from result2 in Observable.Start(() => Do2()) // "do2"
                    .Do(x => report(50, x, "Completed Task2"))
                from result3 in Observable.Start(() => Do3()) // "do3"
                    .Do(x => report(75, x, "Completed Task3"))
                from result4 in Observable.Start(() => Do1()) // "do1" again
                select new ResultWithProgress<string>()
                {
                    Progress = 100,
                    Result = result4,
                    ProgressText = "Done!",
                };

            return query.Subscribe(obs);
        });
    }
    [TestMethod]
    public void TODO3()
    {
        string result = "";
        Calculate3().Subscribe(r => result += r.Result);

        Assert.AreEqual("do1do2do3do1", result);
        // Doesn't compile yet, see below...
    }

    public IObservable<ResultWithProgress<string>> Calculate3()
    {
        return Observable.Create<ResultWithProgress<string>>(obs =>
        {
            Action<int, string, string> report = (pv, r, pt) =>
            {
                obs.OnNext(new ResultWithProgress<string>()
                {
                    Progress = pv,
                    Result = r,
                    ProgressText = pt,
                });
            };

            int[] bla = new int[] { 1, 2, 3, 4 };
            foreach(var b in bla)
            {
                Observable.Start(() => "BLAH" /* expensive operation here in the future */)
                    .Do(x => report(25 * b, x, "Completed Task1"));
            }

            // Completed!
            obs.OnCompleted();

            // I want an Observable that emits "BLAH" four times 
            // and then signals that it is completed
            // What do I return here? 
            return ?????; 
        });
    }
public IObservable<ResultWithProgress<string>> Calculate3()
{
    return Observable.Create<ResultWithProgress<string>>(obs =>
    {
        var query =
            from b in new int[] { 1, 2, 3, 4 }.ToObservable()
            from x in Observable.Start(() => "BLAH" /* expensive operation here in the future */)
            select new ResultWithProgress<string>()
            {
                Progress = 25 * b,
                Result = x,
                ProgressText = "Completed " + b,
            };

        return query.Subscribe(obs);
    });
}
public IObservable<ResultWithProgress<string>> Calculate3()
{
    return
        from b in new int[] { 1, 2, 3, 4 }.ToObservable()
        from x in Observable.Start(() => "BLAH" /* expensive operation here in the future */)
        select new ResultWithProgress<string>()
        {
            Progress = 25 * b,
            Result = x,
            ProgressText = "Completed " + b,
        };
}