我一直在调查Rx库并尝试复制以下视频中的示例......
http://channel9.msdn.com/blogs/j.van.gogh/writing-your-first-rx-application
这一切都有效(对已经更改/弃用的事情进行了一些修改),直到他使用...
.Let(mm => ...)
这会抛出一个编译器错误,说没有let的定义,所以我假设Let已被改为其他东西,或完全删除,但我无法通过Google搜索找到任何解决方案。
那么有人知道在这个例子中使用什么吗?
答案 0 :(得分:6)
根据Jim Wooley的建议。
我认为您正在查看的代码是
var q = from start in mouseDown
from delta in mouseMove.StartWith(start).Until(mouseUp)
.Let(mm=> mm.Zip(mm.Skip(1), (prev, curr) =>
new { X = curr.X - prev.X, Y = curr.Y - prev.Y}))
select delta;
请记住,这是在2009年写的,Rx从那时起就开始了。我想这就是你想要的。我认为Let是你想要避免的功能(即使你可以使用),因为它可以鼓励副作用。改为使用Select进行转换。在下面的情况中,不需要let。
//Gets the delta of positions.
var mouseMovements = mouseMove.Zip(mouseMove.Skip(1), (prev, curr) =>
new { X = curr.X - prev.X, Y = curr.Y - prev.Y}));
//Only streams when mouse is down
var dragging = from md in mouseDown
from mm in mouseMovement.TakeUntil(mouseUp)
select mm;
答案 1 :(得分:1)
尝试使用另一个。选择并投影包含新变量和传入的可观察值的类型。
答案 2 :(得分:1)
您可能正在尝试使用已从当前的Interactive Extensions实验版中删除的EnumerableEx.Let。他们会把它放回去。
与此同时,您可以轻松地自行定义:
public static class EnumerableExx
{
public static U Let<T,U>(this T source, Func<T,U> f)
{
return f(source);
}
}
请注意,此版本适用于任何类型,而不仅仅是IEnumerable。
您也可以使用Memoize(...),因为它可以更好地在左侧缓存集合。
答案 3 :(得分:1)
Let
只允许您为表达式指定一个自己的名称,以便以后可以重用它而不必使用局部变量。您始终可以将Rx表达式拆分为多个部分,并将这些部分分配给局部变量。你可以发布原始查询,我会告诉你如何de-Let'ify它?
答案 4 :(得分:0)
让它仍然存在,这对你不起作用吗?
var observable = new Subject<int>();
observable.Let(mm => mm);
也许您忘记了命名空间导入? (System.Reactive.Linq)?