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 はすべてのソースが少なくとも 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[] として返します。