2011-08-25 54 views
5

我一直investiging在Rx库,并试图从以下视频复制的例子...的Rx让功能

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

它所有的作品(有一些修改,事情已经改变/弃用),直到他用...

.Let(mm => ...) 

这将引发编译器错误说是有为让没有定义,所以我认为,让已改为别的东西,或完全去除,但我不能找到任何Google搜索解决方案。

那么有人知道在这种情况下使用什么?

回答

0

让仍然存在,这不适合你吗?

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

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

+0

嗨,没有这不工作,我已经添加使用声明,也许它在某些程序集,我没有引用?我参考了以下... System.Reactive,System.Reactive.Providers,System.Reactive.Windows.Threading – electricsheep

+0

它在System.Reactive程序集。您使用的是哪个版本的RX,以及在什么平台上? – chrisaut

+0

这是一个WPF应用程序及其从NuGet获得的版本 – electricsheep

1

尝试使用另一种。选择并投影包含新变量和传入可观察值的类型。

1

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

在此期间,你可以自己定义容易,像这样:

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

请注意,此版本适用于任何类型的不只是IEnumerable的。

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

1

Let只是允许你给一个表达自己的名字,所以你可以稍后重用它,而不必使用局部变量。你总是可以将一个Rx表达式分割成几部分并将这些部分分配给局部变量。你可以发布原始查询,我会告诉你如何去取消它?

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是一个你想避免的功能(即使对你有用),因为它可能会导致副作用。改为使用转换。在下面的情况下,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;