Pairwise
1. 概要
Pairwise はソース Observable の隣接する 2 要素をタプル (T Previous, T Current) として発行する演算子です。最初の要素は「前回値」がないため出力を生成せず、2 番目の要素から発行が始まります。
差分計算、変化量の検出、前後比較などに便利です。
Chunk(count: 2, skip: 1) と似ており、どちらも隣り合う 2 要素を 1 要素ずつずらしながら扱います。違いは、Pairwise が常に 2 要素揃った (Previous, Current) タプルだけを発行するのに対し、Chunk(2, 1) は T[] を発行し、ソース完了時に残った 1 要素のチャンクも発行する点です。
2. シグネチャ
Pairwise
csharp
public static Observable<ValueTuple<T, T>> Pairwise<T>(this Observable<T> source)ソースの各要素について、直前の要素とペアにした (Previous, Current) タプルを発行します。ソースが N 個の要素を発行した場合、Pairwise は N-1 個のタプルを発行します。
csharp
source.Pairwise()3. マーブルダイアグラム
ソースが 1, 2, 3, 4 を発行した場合、(1,2), (2,3), (3,4) が発行されます。最初の要素 1 の時点ではペアが成立しないため出力はありません。
同じ入力に対して Chunk(count: 2, skip: 1) を使うと、[1,2], [2,3], [3,4] に加えて、完了時の残余として [4] も発行されます。
4. サンプルコード
差分計算
csharp
// 連続する値の差分を計算
new[] { 10, 15, 13, 20 }.ToObservable()
.Pairwise()
.Subscribe(pair =>
{
var (prev, curr) = pair;
Console.WriteLine($"{prev} -> {curr} (diff: {curr - prev})");
});
// 出力:
// 10 -> 15 (diff: 5)
// 15 -> 13 (diff: -2)
// 13 -> 20 (diff: 7)位置の変化量を検出
csharp
// マウス座標の移動量を計算
mousePositionObservable
.Pairwise()
.Subscribe(pair =>
{
var (prev, curr) = pair;
var deltaX = curr.X - prev.X;
var deltaY = curr.Y - prev.Y;
Console.WriteLine($"Delta: ({deltaX}, {deltaY})");
});変化方向の判定
csharp
// 株価の上昇・下降を判定
stockPriceObservable
.Pairwise()
.Subscribe(pair =>
{
var (prev, curr) = pair;
var direction = curr > prev ? "↑" : curr < prev ? "↓" : "→";
Console.WriteLine($"{prev} {direction} {curr}");
});