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,
};
}