Rx Let function

本文关键字:function Let Rx | 更新日期: 2023-09-27 18:06:33

我一直在研究Rx库,并试图复制下面视频中的示例…

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

这一切都工作(一些修改的东西已经改变/弃用),直到他使用…

.Let(mm => ...)

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

有谁知道在这种情况下该用什么吗?

Rx Let function

按照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已经向前移动了一些。我觉得这就是你想要的。我认为在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;

尝试使用另一个。select并投影一个类型,它既包括你的新变量,也包括传入的可观察值。

您可能正在尝试使用EnumerableEx。Let已从当前实验版的交互式扩展中删除。他们会把它放回去的

同时你可以自己定义它,像这样:

public static class EnumerableExx
{
    public static U Let<T,U>(this T source, Func<T,U> f)
    {
        return f(source);
    }
}

请注意,这个版本适用于任何类型,而不仅仅是IEnumerable。

您也可以使用Memoize(…)来代替,它可以更好地缓存左侧的集合

Let只是允许您为表达式提供自己的名称,以便以后可以重用它,而不必使用局部变量。您总是可以将Rx表达式拆分为多个部分,并将这些部分赋值给局部变量。你能把原来的查询贴出来吗?我会告诉你如何去化它。

Let仍然存在,这对你不起作用吗?

var observable = new Subject<int>();
observable.Let(mm => mm);

也许您忘记了命名空间导入?(System.Reactive.Linq) ?