Skip to content

Merge

1. 概要

Merge は、複数の Observable ソースを 1 つに合流させるファクトリメソッドです。すべてのソースからの値が到着順にそのまま転送されます。すべてのソースが完了すると、結果の Observable も完了します。

2. シグネチャ

params 配列

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

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

csharp
Observable.Merge(sourceA, sourceB, sourceC)

IEnumerable

csharp
public static Observable<T> Merge<T>(this IEnumerable<Observable<T>> sources)

ソースのコレクションを渡す場合に使用します。IEnumerable<Observable<T>> の拡張メソッドとしても呼び出せます。

csharp
var sources = new[] { sourceA, sourceB };
sources.Merge()

Observable<Observable<T>>(高階 Observable の平坦化)

csharp
public static Observable<T> Merge<T>(this Observable<Observable<T>> sources)

ObservableObservable(高階 Observable)を平坦化します。外側のソースが発行する内側の Observable をすべて合流させます。これは オペレーター版 Merge の拡張メソッドです。

csharp
outerObservable.Merge()

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

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

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

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

Merge は複数のソースからの値を到着順にそのまま 1 つのストリームに合流させます。すべてのソースが完了すると結果も完了します。いずれかのソースがエラーを発行した場合、結果も即座にエラーとなります。

4. サンプルコード

csharp
using R3;

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

Observable.Merge(subject1, subject2)
    .Subscribe(x => Console.WriteLine($"値: {x}"));

subject1.OnNext("A");     // 出力: 値: A
subject2.OnNext("1");     // 出力: 値: 1
subject1.OnNext("B");     // 出力: 値: B
subject2.OnNext("2");     // 出力: 値: 2

subject1.OnCompleted();
subject2.OnNext("3");     // 出力: 値: 3(subject1 完了後も subject2 は継続)
subject2.OnCompleted();   // すべて完了 → 結果も完了

// IEnumerable 版
var sources = new[] { subject1.AsObservable(), subject2.AsObservable() };
sources.Merge()
    .Subscribe(x => Console.WriteLine($"値: {x}"));

5. 補足

関連 API

  • Concat — 順番に連結(前のソースが完了してから次を購読)
  • Race — 最初に値を発行したソースのみ購読
  • CombineLatest — 各ソースの最新値を組み合わせる

オペレーター版

オペレーター版 Merge は、拡張メソッドとして source.Merge(second) の形式で使用できます。2 つの Observable を合流させる場合に便利です。この静的ファクトリメソッド版は、3 つ以上のソースや動的なソース集合をまとめて渡す場合に向いています。