過去記事インデックス
- Reactive Extensions再入門 その1
- Reactive Extensions再入門 その2「IObservableインターフェースとIObserverインターフェース」
- Reactive Extensions再入門 その3「IObservableのファクトリメソッド」
- Reactive Extensions再入門 その4「Timer系のファクトリメソッド」
- Reactive Extensions再入門 その5「HotとCold」
- Reactive Extensions再入門 その6「HotなIObservableを作成するファクトリ」
- Reactive Extensions再入門 その7「LINQスタイルの拡張メソッド」
- Reactive Extensions再入門 その8「SkipとTakeメソッド」
- Reactive Extensions再入門 その9「Skip + Take + Repeat = ドラッグ」
- Reactive Extensions再入門 その10「Doメソッド」
- Reactive Extensions再入門 その11「Catchメソッド」
- Reactive Extensions再入門 その12「Finallyメソッドとリソース解放」
- Reactive Extensions再入門 その13「最後の値を取得するLatestとMostRecentメソッド」
- Reactive Extensions再入門 その14「Nextメソッド」
- Reactive Extensions再入門 その15「To*****系メソッド」
- Reactive Extensions再入門 その16「最大、最少、平均を求めるメソッド」
- Reactive Extensions再入門 その17「集計するメソッド」
- Reactive Extensions再入門 その18「CountメソッドとLongCountメソッド」
- Reactive Extensions再入門 その19「AnyメソッドとAllメソッド」
- Reactive Extensions再入門 その20「GroupByメソッドでグルーピングしてみよう」
- Reactive Extensions再入門 その21「GroupByUntilメソッド」
- Reactive Extensions再入門 その22「単一の値を取得するメソッド」
- Reactive Extensions再入門 その23「重複を排除するメソッド」
- Reactive Extensions再入門 その24「単一の値を取得するメソッド その2」
- Reactive Extensions再入門 その25「値をまとめるBufferメソッド」
- Reactive Extensions再入門 その26「値をまとめるWindowメソッド」
- Reactive Extensions再入門 その27「時間でフィルタリング?Sampleメソッド」
- Reactive Extensions再入門 その28「落ち着いたら流すThrottleメソッド」
- Reactive Extensions再入門 その29「値を指定した時間だけ遅延させるDelayメソッド」
- Reactive Extensions再入門 その30「もう待ちきれない!を表現するTimeoutメソッド」
はじめに
個人的には、単発メソッドの紹介はそろそろおおづめ。今回はデバッグに便利そうなメソッドについて紹介します。
時間に関する情報を付与する拡張メソッド
ここでは、IObservable
Timestampメソッド
ここでは、Timesptampメソッドについて説明します。Timestampメソッドは、IObservable
public static IObservable<Timestamped<T>> Timestamp<T>(this IObservable<T> source);
戻り値がIObservable
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
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
public static IObservable<TimeInterval<T>> TimeInterval<T>(this IObservable<T> source);
戻り値が、IObservable
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
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
値が発行された間隔が表示されていることが確認できます。