CombineLatest
1. 概要
CombineLatest は、複数の Observable ソースの最新値を組み合わせるファクトリメソッドです。いずれかのソースが値を発行するたびに、すべてのソースの最新値を配列にまとめて発行します。
ただし、すべてのソースが少なくとも 1 回は値を発行するまで、結合値は発行されません。
この静的ファクトリメソッド版は、同じ型の Observable を params 配列または IEnumerable で受け取り、結果を T[] として返します。異なる型のソースを組み合わせる場合は、2〜15 ソース対応の オペレーター版 CombineLatest を使用してください。
2. シグネチャ
params 配列
csharp
public static Observable<T[]> CombineLatest<T>(params Observable<T>[] sources)可変長引数で複数のソースを指定します。ソース数がコンパイル時に決まっている場合に便利です。
csharp
Observable.CombineLatest(sourceA, sourceB, sourceC)IEnumerable
csharp
public static Observable<T[]> CombineLatest<T>(IEnumerable<Observable<T>> sources)ソースのコレクションを動的に渡す場合に使用します。
csharp
var sources = new List<Observable<int>> { sourceA, sourceB };
Observable.CombineLatest(sources)オーバーロードの使い分け
| オーバーロード | 使う場面 |
|---|---|
CombineLatest<T>(params Observable<T>[]) | ソース数がコンパイル時に決まっている場合 |
CombineLatest<T>(IEnumerable<Observable<T>>) | ソースを動的に生成・収集する場合 |
3. マーブルダイアグラム
CombineLatest はすべてのソースが少なくとも 1 回値を発行した後、いずれかのソースが新しい値を発行するたびに、全ソースの最新値を配列として発行します。すべてのソースが完了すると結果も完了します。
4. サンプルコード
csharp
using R3;
// 2 つのソースの最新値を組み合わせる
var subject1 = new Subject<string>();
var subject2 = new Subject<string>();
Observable.CombineLatest(subject1, subject2)
.Subscribe(values => Console.WriteLine($"[{string.Join(", ", values)}]"));
subject1.OnNext("A"); // まだ出力なし(subject2 が未発行)
subject2.OnNext("1"); // 出力: [A, 1]
subject1.OnNext("B"); // 出力: [B, 1]
subject2.OnNext("2"); // 出力: [B, 2]
subject1.OnNext("C"); // 出力: [C, 2]
subject1.OnCompleted();
subject2.OnCompleted();
// IEnumerable でソースを動的に渡す
var sources = Enumerable.Range(0, 3)
.Select(_ => new Subject<int>())
.ToArray();
Observable.CombineLatest(sources.AsEnumerable())
.Subscribe(values => Console.WriteLine($"[{string.Join(", ", values)}]"));5. 補足
オペレーター版との違い
オペレーター版 CombineLatest は 2〜15 個の異なる型のソースを受け取り、resultSelector 関数で結合結果を任意の型に変換できます。この静的ファクトリメソッド版は同じ型のソースのみを対象とし、結果を T[] として返します。