Skip to content

CombineLatest

1. 概要

CombineLatest は、複数の Observable ソースの最新値を組み合わせるファクトリメソッドです。いずれかのソースが値を発行するたびに、すべてのソースの最新値を配列にまとめて発行します。

ただし、すべてのソースが少なくとも 1 回は値を発行するまで、結合値は発行されません。

この静的ファクトリメソッド版は、同じ型の Observableparams 配列または 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 のマーブルダイアグラム

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[] として返します。

関連 API

  • ZipLatest — すべてのソースが新しい値を発行するまで待ってから組み合わせる
  • Zip — インデックス順にペアリングする
  • Merge — 値を組み合わせずにそのまま合流する