4

観察可能なシーケンスを、元のシーケンスのタイムスタンプ間の時間間隔でTimestamped<T>あるシーケンスに変換するにはどうすればよいですか?TimeInterval<T>

入力シーケンスを考えると..

new Timestamped<int>(1, DateTime.Parse("2000-01-01 00:00:01"))
new Timestamped<int>(2, DateTime.Parse("2000-01-01 00:00:05"))
new Timestamped<int>(3, DateTime.Parse("2000-01-01 00:01:04"))

.. 出力は次のようになります。

new TimeInterval<int>(1, TimeSpan.Parse("00:00:00"))
new TimeInterval<int>(2, TimeSpan.Parse("00:00:04"))
new TimeInterval<int>(3, TimeSpan.Parse("00:00:59"))
4

3 に答える 3

2

これでいけると思います

var s = source.Publish().RefCount();
var sprev = s.Take(1).Concat(s);
var scurrent = s;

var converted = Observable.Zip(sprev, scurrent, (prev, current) =>
   new TimeInterval<int>(current.Value, current.Timestamp - prev.Timestamp));

私が確信していない唯一のことはZip、どちらかのシーケンスが終了したときに終了するかどうかです。あると思いますが、テストしていません。

于 2013-05-09T15:39:41.303 に答える
1

おそらく、単純な射影を と組み合わせて使用​​できますDo

static IObservable<TimeInterval<T>> ToTimeInterval<T>(
    this IObservable<Timestamped<T>> source)
{
    DateTimeOffset? previous = null;
    return source.Select(ts => 
        new
        {
            Timestamp = ts.Timestamp,
            Value = ts.Value,
            TimeSpan = previous.HasValue ? ts.Timestamp - previous
                                         : TimeSpan.FromSeconds(0)
        })
        .Do(xx => { previous = xx.Timestamp; })
        .Select(xx => new TimeInterval<T>(xx.Value, xx.TimeSpan));
}

次のように使用します。

var intervals = stampedData.ToTimeInterval();
于 2013-05-09T16:15:37.137 に答える
0

オブザーバブルについてはよくわかりませんが、次のことができますか?

 myInputSequence.ToEnumerable().Select(t => 
    new TimeInterval<int>(
        t.Value,
        t.Value == 1 
            ? new TimeSpan(0) 
            : t.Timestamp - System.Reactive.Linq.Observable.ToEnumerable(myList).FirstOrDefault(t2 => t2.Value == t.Value - 1).Timestamp)
        ).ToObservable();

もちろん、これは可能な限り効率的ではありません。特に、ログ ステートメントが順番に並んでいることがわかっている場合はなおさらです。

于 2013-05-09T15:40:34.370 に答える