2011-08-25 19 views
5

He estado investiging la biblioteca Rx y han tratado de reproducir el ejemplo del siguiente vídeo ...Rx Let función

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

que todas las obras (con algunas modificaciones a las cosas que han sido cambiados/obsoleto) hasta que usó ...

.Let(mm => ...) 

Esto arroja un error de compilación diciendo que no existe una definición, para alquiler, así que supongo que le permiten se ha cambiado a otra cosa, o eliminado por completo, pero no puedo encontrar ningún soluciones de Google.

Entonces, ¿alguien sabe qué usar en esta instancia?

Respuesta

0

Let Still exists, does this work hand for you?

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

¿Olvidó su contraseña? (System.Reactive.Linq)?

+0

Hola, no, eso no funciona y ya he agregado esa declaración de uso, ¿quizás está en algún conjunto que no he mencionado? He hecho referencia a lo siguiente ... System.Reactive, System.Reactive.Providers, System.Reactive.Windows.Threading – electricsheep

+0

Está en el ensamblado System.Reactive. ¿Qué versión de RX estás usando y en qué plataforma? – chrisaut

+0

esta es una aplicación WPF y es la versión que obtuve de NuGet – electricsheep

1

Pruebe usar otro. Seleccione y proyecte un tipo que incluya tanto su nueva variable como el valor observable entrante.

1

Usted probablemente está intentando utilizar EnumerableEx.Let que ha sido retirado de la actual versión experimental de las Extensiones interactivos. Van a poner de nuevo en

En el ínterin se puede definir por sí mismo fácilmente de esta manera:.

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

Tenga en cuenta que esta versión funciona con cualquier tipo no sólo IEnumerable.

También podría usar Memoize (...) que puede ser mejor ya que guarda en caché la colección en el lado izquierdo.

1

Let simplemente le permite dar una expresión de su propio nombre para que pueda volver a utilizarlo más adelante sin tener que utilizar una variable local. Siempre puede dividir una expresión Rx en pedazos y asignar las piezas a las variables locales. ¿Puedes publicar la consulta original y te mostraré cómo de-Let'ify it?

6

Según la sugerencia de Jim Wooley.

creo que el código que está viendo es

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; 

Hay que recordar que fue escrito en 2009 y Rx tiene mueva a lo largo de algunos desde entonces. Creo que esto es lo que quieres. Creo que Let es una característica que quieres evitar (incluso si está disponible para ti) en Rx, ya que puede alentar los efectos secundarios. Use la transformación con Select en su lugar. En el caso de abajo, el let simplemente no es necesario.

//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;