2011-08-25 16 views
5

Ive investiging biblioteca Rx e hanno cercato di replicare l'esempio seguente video ...Rx Let funzione

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

funziona il tutto (con alcune modifiche alle cose che sono state modificate/deprecato) fino a quando ha usato ...

.Let(mm => ...) 

Questo genera un errore di compilatore dicendo che non esiste una definizione per Let, quindi immagino che Let è stato cambiato in qualcosa d'altro, o rimossi del tutto, ma i cant trovare qualsiasi soluzioni da un googling.

Quindi qualcuno sa cosa usare in questa istanza?

risposta

0

Lasciare esiste ancora, questo non funziona per voi?

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

Forse hai dimenticato un'importazione di Namespace? (System.Reactive.Linq)?

+0

Ciao no, questo non funziona e Ive ha già aggiunto che usando l'istruzione, forse è in un assembly che non ho fatto riferimento? Ive fa riferimento a quanto segue ... System.Reactive, System.Reactive.Providers, System.Reactive.Windows.Threading – electricsheep

+0

Its in System.Reactive assembly. Quale versione di RX stai usando e su quale piattaforma? – chrisaut

+0

questa è un'applicazione WPF e la sua versione che ho ricevuto da NuGet – electricsheep

1

Provare a utilizzarne un altro. Selezionare e proiettare un tipo che includa sia la nuova variabile che il valore osservabile in entrata.

1

Probabilmente stai tentando di utilizzare EnumerableEx.Let che è stato rimosso dalla versione sperimentale corrente delle estensioni interattive. Faranno rimetterlo in

Nel frattempo è possibile definire facilmente da soli in questo modo:.

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

Nota che questa versione funziona con qualsiasi tipo, non solo IEnumerable.

È anche possibile utilizzare Memoize (...), che può essere migliore in quanto memorizza nella cache la raccolta sul lato sinistro.

1

Let consente semplicemente di dare un'espressione al proprio nome in modo da poterlo riutilizzare in un secondo momento senza dover utilizzare una variabile locale. È sempre possibile dividere un'espressione Rx in pezzi e assegnare i pezzi alle variabili locali. Puoi pubblicare la query originale e ti mostrerò come de-Let'ify?

6

Secondo il suggerimento di Jim Wooley.

Credo che il codice che state guardando è

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; 

Ricordate che è stato scritto nel 2009 e Rx ha muovono lungo un po 'da allora. Penso che questo sia quello che vuoi. Penso che Let sia una caratteristica che vuoi evitare (anche se a tua disposizione) in Rx in quanto può incoraggiare effetti collaterali. Utilizza invece la trasformazione con Seleziona. Nel caso qui sotto, il let non è proprio necessario.

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