Skip to content

ZipLatest

1. 概要

ZipLatest は、すべてのソースが前回の発行以降に新しい値を発行するまで待ち、揃った時点で各ソースの最新値を配列にまとめて発行するファクトリメソッドです。

CombineLatest といずれかのソースが値を発行するたびに最新値を組み合わせるのに対し、ZipLatest はすべてのソースが新しい値を出すまで発行を保留します。これにより、各ソースの更新が揃ったタイミングでのみ処理を行いたいユースケースに適しています。

2. シグネチャ

params 配列

csharp
public static Observable<T[]> ZipLatest<T>(params Observable<T>[] sources)

可変長引数で複数のソースを指定します。

csharp
Observable.ZipLatest(sourceA, sourceB)

IEnumerable

csharp
public static Observable<T[]> ZipLatest<T>(IEnumerable<Observable<T>> sources)

ソースのコレクションを動的に渡す場合に使用します。

csharp
var sources = new List<Observable<int>> { sourceA, sourceB };
Observable.ZipLatest(sources)

オーバーロードの使い分け

オーバーロード使う場面
ZipLatest<T>(params Observable<T>[])ソース数がコンパイル時に決まっている場合
ZipLatest<T>(IEnumerable<Observable<T>>)ソースを動的に生成・収集する場合

3. マーブルダイアグラム

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

ZipLatest はすべてのソースが少なくとも 1 つの新しい値を発行するまで待機します。全ソースが揃った時点で、各ソースの最新値を配列として発行します。前回の発行後に複数回値を発行したソースがある場合、最新の値のみが使用されます。

4. サンプルコード

csharp
using R3;

var subject1 = new Subject<string>();
var subject2 = new Subject<string>();

Observable.ZipLatest(subject1, subject2)
    .Subscribe(values => Console.WriteLine($"[{string.Join(", ", values)}]"));

subject1.OnNext("A");     // まだ出力なし(subject2 が未発行)
subject1.OnNext("B");     // まだ出力なし(subject2 が未発行、最新値は B に更新)
subject2.OnNext("1");     // 出力: [B, 1](全ソースが揃った)
subject1.OnNext("C");     // まだ出力なし(subject2 が未発行)
subject2.OnNext("2");     // 出力: [C, 2]
subject2.OnNext("3");     // まだ出力なし(subject1 が未発行)
subject1.OnNext("D");     // 出力: [D, 3]

subject1.OnCompleted();
subject2.OnCompleted();

5. 補足

オペレーター版との違い

オペレーター版 ZipLatest は、2〜15 個の異なる型のソースを受け取り、resultSelector 関数で結合結果を任意の型に変換できます。この静的ファクトリメソッド版は同じ型のソースのみを対象とし、結果を T[] として返します。