かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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