最初に達成したいことを説明しましょう。Rxでのデータベースのバッファリング
私は、次のデータの受信形式にイベントストリーム
var data = new string[] {
"hello",
"Using",
"ok:michael",
"ok",
"begin:events",
"1:232",
"2:343",
"end:events",
"error:dfljsdf",
"fdl",
"error:fjkdjslf",
"ok"
};
私は、データ・ソースをサブスクライブするとき、私は私がしたい、基本的に次のような結果
"ok:michael"
"ok"
"begin:events 1:232 2:343 end:events"
"error:dfljsdf"
"error:fjkdjslf"
"ok"
を取得したいと思いを持っているとしましょうがokかエラーで開始し、データがから開始と終了の間でになるようにしてください。私は反応性プログラミングに非常に新しいですので、私はこれまでのところ、これを試してみました
..
var data = new string[] {
"hello",
"Using",
"ok:michael",
"ok",
"begin:events",
"1:232",
"2:343",
"end:events",
"error:dfljsdf",
"fdl",
"error:fjkdjslf",
"ok"
};
var dataStream = Observable.Generate(
data.GetEnumerator(),
e => e.MoveNext(),
e => e,
e => e.Current.ToString(),
e => TimeSpan.FromSeconds(0.1));
var onelineStream = from d in dataStream
where d.StartsWith("ok") || d.StartsWith("error")
select d;
// ???
// may be need to buffer? I want to get data like "begin:events 1:232 2:343 end:events"
// but it is not working...
var multiLineStream = from list in dataStream.Buffer<string, string, string>(
bufferOpenings: dataStream.Where(d => d.StartsWith("begin")),
bufferClosingSelector: b => dataStream.Where(d => d.StartsWith("end")))
select String.Join(" ", list);
// merge two stream????
// but I have no clue how to merge these twos :(
mergeStream .Subscribe(d =>
{
Console.WriteLine(d);
Console.WriteLine();
});
、私は自分自身が反応性の方法で考えるようにすることはできません。 :(あなたが正しい答えにとても、とても接近していた事前に
感謝。
私は10回upvoteできたらいいなあ。 :) –
他の訪問者のために 'dataStream'がイベント(私の場合は' Observable.FromEvent'ファクトリメソッド)から作成された場合、 'Publish'メソッドは必要ありません。 –
これは本当に非常に教育的なスタイルで元のコードのすべての問題を完全にカバーする優れた答えです。フルクレジット。 – yamen