Skip to content

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. マーブルダイアグラム

Pairwise のマーブルダイアグラム

ソースが 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}");
    });