たとえば、列挙可能なものがあるとします
dim e = Enumerable.Range(0, 1024)
できるようになりたい
dim o = e.ToObservable(Timespan.FromSeconds(1))
列挙可能値が使い果たされるまで、オブザーバブルが毎秒値を生成するようにします。これを行う簡単な方法がわかりません。
たとえば、列挙可能なものがあるとします
dim e = Enumerable.Range(0, 1024)
できるようになりたい
dim o = e.ToObservable(Timespan.FromSeconds(1))
列挙可能値が使い果たされるまで、オブザーバブルが毎秒値を生成するようにします。これを行う簡単な方法がわかりません。
Interval を Zip と一緒に使用して、目的の機能を取得できます。
var sequence = Observable.Interval(TimeSpan.FromSeconds(1))
.Zip(e.ToObservable(), (tick, index) => index)
私も解決策を探しましたが、rx のイントロを読んだ後、自分自身を作成しました。ピリオドとして、独自の拡張メソッドObservable.Generate()
を作成するために使用したオーバーロードがあります。ToObservable()
TimeSpan
public static class MyEx {
public static IObservable<T> ToObservable<T>(this IEnumerable<T> enumerable, TimeSpan period)
{
return Observable.Generate(
enumerable.GetEnumerator(),
x => x.MoveNext(),
x => x,
x => x.Current,
x => period);
}
public static IObservable<T> ToObservable<T>(this IEnumerable<T> enumerable, Func<T,TimeSpan> getPeriod)
{
return Observable.Generate(
enumerable.GetEnumerator(),
x => x.MoveNext(),
x => x,
x => x.Current,
x => getPeriod(x.Current));
}
}
すでにLINQPadでテストされています。結果のオブザーバブルが破棄された後に列挙子インスタンスで何が起こるかについてのみ関係します。修正を歓迎します。
You'd need something to schedule notifying observers with each value taken from the Enumerable. You can use the recursive Schedule overload on an Rx scheduler.
Public Shared Function Schedule ( _
scheduler As IScheduler, _
dueTime As TimeSpan, _
action As Action(Of Action(Of TimeSpan)) _
) As IDisposable
On each scheduled invocation, simply call enumerator.MoveNext()
, and call OnNext(enumerator.Current)
, and finally OnCompleted
when MoveNext()
returns false. This is pretty much the bare-bones way of doing it.
An alternative was to express your requirement is to restate it as "for a sequence, have a minimum interval between each value".
See this answer. The test case resembles your original question.
Range を使用して質問を軽視しているとしか思えません。
Enumerable がプッシュするすべての値を 1 秒遅らせたいですか?
var e = Enumerable.Range(0, 10);
var o = Observable.Interval(TimeSpan.FromSeconds(1))
.Zip(e, (_,i)=>i);
または、毎秒 Enumerable の最後の値のみをプッシュする必要がありますか。つまり、列挙するときに評価されている Enumerable から読み取る (おそらく一部の IO)。その場合、 CombineLatestはZipよりも便利です。
または、毎秒値を取得したいだけの場合は、Observable.Interval メソッドを使用します。
var o = Observable.Interval(TimeSpan.FromSeconds(1));
あなたの問題空間を説明すれば、コミュニティはあなたをよりよく助けることができるでしょう.
リー
* C# の回答で申し訳ありませんが、同等の VB.NET コードが何であるかはわかりません。
この非常に単純なアプローチはいつでも実行できます。
dim e = Enumerable.Range(0, 1024)
dim o = e.ToObservable().Do(Sub (x) Thread.Sleep(1000))
値をサブスクライブするとo
、生成されるまでに 1 秒かかります。