0

N秒間イベントを生成し続ける正しいRx拡張メソッド(.NET内)は何ですか?

「N 秒間イベントを生成し続ける」とは、DateTime.Now から DateTime.Now + TimeSpan.FromSeconds(N) までループ内でイベントを生成し続けることを意味します。

多数の仮説を生成し、最も成功した仮説を次の世代に伝播する遺伝的アルゴリズムに取り組んでいます。この男をエレガントな方法で拘束する必要があります。

後で追加:

私は実際にプッシュの代わりにプルを行う必要があることに気づき、次のようなものを思いつきました:

public static class IEnumerableExtensions
{
    public static IEnumerable<T> Pull<T>(this IEnumerable<T> enumerable, int? times = null)
    {
        if (times == null) 
            return enumerable.ToArray();
        else
            return enumerable.Take(times.Value).ToArray();
    }

    public static IEnumerable<T> Pull<T>(this IEnumerable<T> enumerable, TimeSpan timeout, int? times = null)
    {
        var start = DateTime.Now;

        if (times != null) enumerable = enumerable.Take(times.Value);

        using (var iterator = enumerable.GetEnumerator())
        {
            while (DateTime.Now < start + timeout && iterator.MoveNext())
                yield return iterator.Current;
        }
    }
}

使用法は次のようになります。

var results = lazySource.SelectMany(item =>
{
    //processing goes here
}).Pull(timeout: TimeSpan.FromSeconds(5), times: numberOfIterations);
4

2 に答える 2

4

これを行うためのよりクリーンな方法があるかもしれませんが、次を使用できます。

// This will generate events repeatedly
var interval = Observable.Interval(...);

// This will generate one event in N seconds
var timer = Observable.Timer(TimeSpan.FromSeconds(N));

// This will combine the two, so that the interval stops when the timer
// fires
var joined = interval.TakeUntil(timer);

Rx を行ってから長い時間が経ちました。これが正しくない場合は申し訳ありませんが、試してみる価値はあります...

于 2013-03-28T22:23:47.740 に答える
0

Jon の投稿はかなり適切ですが、これを行うために独自の拡張メソッドを作成することを提案した編集に気付きました。組み込みの演算子を使用した方が良いと思います*。

//LinqPad sample
void Main()
{
    var interval = Observable.Interval(TimeSpan.FromMilliseconds(250));  
    var maxTime = Observable.Timer(TimeSpan.FromSeconds(10));
    IEnumerable<int> lazySource = Enumerable.Range(0, 100);

    lazySource.ToObservable()
            .Zip(interval, (val, tick)=>val)
            .TakeUntil(maxTime)
            .Dump();
}

*すなわち。他の開発者が簡単に維持および理解できる

于 2013-04-02T08:58:12.280 に答える