2011-08-25 16 views
5

Ive investiging bibliotekę Rx i próbowali powtórzyć przykład z poniższym wideo ...Rx Niech funkcja

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

to wszystko działa (z pewnymi modyfikacjami do rzeczy, które zostały zmienione/przestarzałe) aż użył ...

.Let(mm => ...) 

ten wyrzuca błąd kompilatora mówiąc, że nie ma definicji dla wynajem, więc zakładam, że Let została zmieniona na coś innego, lub całkowicie usunięte, ale nie mogę znaleźć żadnego rozwiązania z googlowania.

Więc czy ktoś wie co użyć w tym przypadku?

Odpowiedz

0

Niech nadal istnieje, to nie działa dla Ciebie?

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

Być może zapomniałeś importu Przestrzeni nazw? (System.Reactive.Linq)?

+0

Witam, nie, to nie działa i już dodałem, że używając instrukcji, być może jest to w jakimś zespole, do którego się nie odwołałem? Ive odwołał się do następujących ... System.Reactive, System.Reactive.Providers, System.Reactive.Windows.Threading – electricsheep

+0

Jest w montażu System.Reactive. Jakiej wersji RX używasz i na jakiej platformie? – chrisaut

+0

to jest aplikacja WPF i jej wersja dostałem od NuGet – electricsheep

1

Spróbuj użyć innego .Wybrać i typ projektu, który obejmuje zarówno nową zmienną i przychodzące wartość zaobserwowania.

1

Prawdopodobnie próbuje użyć EnumerableEx.Let który został usunięty z bieżącego Eksperymentalna wersja interaktywnego Extensions. Będą umieścić go z powrotem w

W międzyczasie można to łatwo zdefiniować siebie tak:.

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

pamiętać, że ta wersja działa z każdym rodzajem nie tylko IEnumerable.

Można również użyć Memoize (...) zamiast które mogą być lepsze, ponieważ buforuje kolekcję na lewym skrzydle.

1

Let tylko pozwala dać wyraz swoją własną nazwę, dzięki czemu można go używać ponownie później bez konieczności użycia zmiennej lokalnej. Zawsze możesz podzielić wyrażenie Rx na części i przypisać je do zmiennych lokalnych. Czy możesz opublikować oryginalne zapytanie, a pokażę ci, jak odrzucić to?

6

Zgodnie z sugestią Jima Wooleya.

myślę kod szukasz na to

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; 

Pamiętaj, że został napisany w 2009 roku, a Rx ma poruszać się trochę od tego czasu. Myślę, że tego właśnie chcesz. Myślę, że Let to funkcja, której chcesz uniknąć (nawet jeśli jest dostępna) w Rx, ponieważ może to zachęcać do efektów ubocznych. Użyj transformacji za pomocą Wybierz zamiast tego. W poniższym przykładzie wynajem nie jest po prostu potrzebny.

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