2012-04-09 22 views
5

RxのSelectManyオペレータがどのように機能するか教えてください。私はLinqのこの演算子についてもっと知りません。複数選択Rx

簡単な例の助けを借りて、またRxでこの演算子をどのように使用するかを説明してください。

+1

http://stackoverflow.com/questions/3869329/rx-enumerableex-for-vs -enumerable-selectmany –

+0

それは少し複雑に思えます。私はこの技術にはかなり新しいです。単純なサンプルを提供できますか? – StezPet

答えて

16

SelectManyは、投影と平坦化を1つのステップにまとめました。観察可能な1(いくつかのオーバーロードが実際にあります)の中に複数のシーケンスを平らにすることができます受信に{ 1, 2, 3, 4, 5, 6, 7}

SelectMany:あなたはあなたのような1つのリストにそれを平らにするSelectManyを使用することができます{ {1, 2}, {3, 4, 5}, { 6, 7 } }のようなリストの数を持っていると仮定します。

具体的な例として、ファイルがダウンロード完了したときに値を生成するObservableを提供する関数DownloadFile(filename)があるとします。 DownloadFile

string[] files = { "http://.../1", "http://.../2", "http://.../3" }; 

files.ToObservable() 
       .SelectMany(file => DownloadFile(file)) 
       .Take(3) 
       .Subscribe(c => Console.WriteLine("Got " + c) ,()=> Console.WriteLine("Completed!")); 

すべての3つの観測が一つに平坦化されているので、3つの値は、すべてのダウンロードが完了していることを確認するために到着するために、あなたは待つことができます:あなたは今書くことができます。

+0

SelectManyをコード内で使用した理由を理解できませんでした。リストのリストがありません - >あなたは平坦化されませんでした。コードを選択したばかりの場合は? –

+0

'選択 'を使うと、観察可能なものが観測可能になります。 – Asti

+0

もっと説明できますか?それは私のためにはっきりしていなかった、私はまだLINQとRXで新しい –

18

SelectManyはわずかである:すなわち

source.Select(selector).Merge(); 

、それは、観測のストリームにソース入力を選択し、結果のストリームに各観測を平ら。