かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Reactive Extensions再入門 その31「時間に関する情報を付与するTimestampとTimeIntervalメソッド」

過去記事インデックス

はじめに

個人的には、単発メソッドの紹介はそろそろおおづめ。今回はデバッグに便利そうなメソッドについて紹介します。

時間に関する情報を付与する拡張メソッド

ここでは、IObservableのシーケンスに対して時間に関する情報を付与するIObservableの拡張メソッドについて説明します。

Timestampメソッド

ここでは、Timesptampメソッドについて説明します。Timestampメソッドは、IObservableのシーケンスに対して、その名の通りタイムスタンプを追加するメソッドです。メソッドのシグネチャを以下に示します。

public static IObservable<Timestamped<T>> Timestamp<T>(this IObservable<T> source);

戻り値がIObservable>型になっています。このTimestamped型は以下のように定義されています。(演算子のオーバーロード等は省いています)

using System;

namespace System.Reactive
{
    public struct Timestamped<T>
    {
        public DateTimeOffset Timestamp { get; }
        public T Value { get; }
    }
}

Timestampプロパティで、時間を取得しValueプロパティで値を取得するシンプルな構造体です。コード例を下記に示します。

var subscriber = Observable
    // 1秒間隔で0〜4の値を発行
    .Generate(0, i => i < 5, i => i + 1, i => i, _ => TimeSpan.FromSeconds(1))
    // タイムスタンプをつける(Timestamped<T>型になる)
    .Timestamp()
    // 購読
    .Subscribe(
        i => Console.WriteLine("Timestamp: {0}, Value: {1}", i.Timestamp, i.Value));

// 終了待ち
Console.WriteLine("Please enter key.");
Console.ReadLine();
subscriber.Dispose();

1秒間隔で0〜4の値を発行して、それにTimestampメソッドを呼び出してTimestamped型に変換しています。そしてSubscribeでTimestampとValueを表示しています。実行結果を以下に示します。

Please enter key.
Timestamp: 2012/02/05 22:47:59 +09:00, Value: 0
Timestamp: 2012/02/05 22:48:00 +09:00, Value: 1
Timestamp: 2012/02/05 22:48:01 +09:00, Value: 2
Timestamp: 2012/02/05 22:48:02 +09:00, Value: 3
Timestamp: 2012/02/05 22:48:03 +09:00, Value: 4

値が発行された時の時間が表示されていることが確認できます。

TimeIntervalメソッド

ここでは、TimeIntervalメソッドについて説明します。TimeIntervalメソッドはIObservableのシーケンスから発行された値の間隔をTimeSpan型で追加します。メソッドのシグネチャを以下に示します。

public static IObservable<TimeInterval<T>> TimeInterval<T>(this IObservable<T> source);

戻り値が、IObservable>型になっています。TimeInterval型は以下のように定義されています。(演算子のオーバーロード等は省いています)

using System;

namespace System.Reactive
{
    public struct TimeInterval<T>
    {
        public TimeSpan Interval { get; }
        public T Value { get; }
    }
}

Intervalプロパティで時間間隔を取得し、Valueプロパティで値を取得するシンプルな構造体です。コード例を下記に示します。

var subscriber = Observable
    // 1秒間隔で0〜4の値を発行
    .Generate(0, i => i < 5, i => i + 1, i => i, _ => TimeSpan.FromSeconds(1))
    // 値の発行間隔をつける(TimeInterval<T>型になる)
    .TimeInterval()
    // 購読
    .Subscribe(
        i => Console.WriteLine("Interval: {0}, Value: {1}", i.Interval, i.Value));

// 終了待ち
Console.WriteLine("Please enter key.");
Console.ReadLine();
subscriber.Dispose();

1秒間隔で0〜4の値を発行して、それにTimeIntervalメソッドを呼び出してTimeInterval型に変換しています。そしてSubscribeでIntervalとValueを表示しています。実行結果を以下に示します。

Please enter key.
Interval: 00:00:01.0050575, Value: 0
Interval: 00:00:01.0150581, Value: 1
Interval: 00:00:01.0140580, Value: 2
Interval: 00:00:01.0140580, Value: 3
Interval: 00:00:01.0120578, Value: 4

値が発行された間隔が表示されていることが確認できます。