Rx让功能

时间:2011-08-25 12:57:44

标签: c# .net system.reactive

我一直在调查Rx库并尝试复制以下视频中的示例......

http://channel9.msdn.com/blogs/j.van.gogh/writing-your-first-rx-application

这一切都有效(对已经更改/弃用的事情进行了一些修改),直到他使用...

.Let(mm => ...)

这会抛出一个编译器错误,说没有let的定义,所以我假设Let已被改为其他东西,或完全删除,但我无法通过Google搜索找到任何解决方案。

那么有人知道在这个例子中使用什么吗?

5 个答案:

答案 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)?