2011-08-25 13 views
5

アイブ氏は、Rxのライブラリをinvestigingされて、次のビデオからの例を複製しようとしています...RxのLet関数

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

それは非推奨/変更されているものにいくつかの変更を加えたすべての作品( )彼が使用し、最大まで...

.Let(mm => ...) 

これはLETのための定義はないというコンパイルエラーがスローされますので、私はレッツは、何か他のものに変更、または完全に除去されたと仮定し、私はいずれかを見つけるカントグーグルのソリューション

誰もこのインスタンスで何を使用するかを知っていますか?

答えて

0

まだ存在しますが、これはうまくいかないのですか?

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

名前空間のインポートを忘れた可能性がありますか? (System.Reactive.Linq)?

+0

こんにちは、それは動作しませんし、私はすでにステートメントを使用して追加、おそらくそれは私が参照していないいくつかのアセンブリにありますか? Iveは以下を参照しました... System.Reactive、System.Reactive.Providers、System.Reactive.Windows.Threading – electricsheep

+0

System.Reactiveアセンブリ内にあります。どのRXのバージョンを使用していますか、どのプラットフォームで使用していますか? – chrisaut

+0

これはWPFアプリケーションであり、NuGetから入手したバージョン – electricsheep

1

別の変数を使用してみてください。新しい変数と受信可能な観測値の両方を含む型を選択して投影してください。

1

おそらく、インタラクティブエクステンションの現在の実験版から削除されたEnumerableEx.Letを使用しようとしています。彼らはに戻ってそれを置くだろう

一方であなたは簡単にそうようにそれを自分で定義することができます。このバージョンはただのIEnumerableない任意のタイプで動作することを

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

注意。

代わりに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は、それ以来、いくつかに沿って移動していることを忘れないでください。私はこれがあなたが望むものだと思います。私はレットが、副作用を助長できるので、あなたがRxで(あなたに利用可能であっても)避けたい機能だと思う。代わりに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;