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メソッド」
Reactive Extensions再入門 番外編「センサー監視」
Reactive Extensions再入門 番外編「System.Reactive.Linq.Observableのメソッド一覧とメモ」
個人的には、単発メソッドの紹介はそろそろおおづめ。今回は
デバッグ
に便利そうなメソッドについて紹介します。
時間に関する情報を付与する拡張メソッド
ここでは、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
.Generate(0, i => i < 5, i => i + 1, i => i, _ => TimeSpan.FromSeconds(1))
.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
.Generate(0, i => i < 5, i => i + 1, i => i, _ => TimeSpan.FromSeconds(1))
.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
値が発行された間隔が表示されていることが確認できます。