Skip to content

Concat

1. 概要

Concat は、複数の Observable ソースを順番に連結するファクトリメソッドです。前のソースが完了してから次のソースを購読し、すべての値を順序どおりに転送します。すべてのソースが完了すると、結果の Observable も完了します。

2. シグネチャ

params 配列

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

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

csharp
Observable.Concat(first, second, third)

IEnumerable

csharp
public static Observable<T> Concat<T>(IEnumerable<Observable<T>> sources)

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

csharp
var sources = new List<Observable<int>> { first, second };
Observable.Concat(sources)

Observable<Observable<T>>(高階 Observable の順次連結)

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

高階 Observable を順次連結します。外側のソースが発行する内側の Observable を 1 つずつ順番に購読します。これは オペレーター版 Concat の拡張メソッドです。

csharp
outerObservable.Concat()

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

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

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

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

Concat は最初のソースのすべての値を転送し、そのソースが完了すると次のソースを購読します。これをすべてのソースが完了するまで繰り返します。

4. サンプルコード

csharp
using R3;

var first = new Subject<string>();
var second = new Subject<string>();

Observable.Concat(first, second)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        r => Console.WriteLine($"完了: {r}"));

first.OnNext("A");       // 出力: 値: A
first.OnNext("B");       // 出力: 値: B
second.OnNext("X");      // 出力なし(first がまだ完了していない)
first.OnCompleted();     // first 完了 → second の購読開始
second.OnNext("1");      // 出力: 値: 1
second.OnNext("2");      // 出力: 値: 2
second.OnCompleted();    // 出力: 完了: Success

// IEnumerable 版
var sources = new[]
{
    Observable.Return("first"),
    Observable.Return("second"),
    Observable.Return("third")
};
Observable.Concat(sources)
    .Subscribe(x => Console.WriteLine($"値: {x}"));
// 出力: 値: first
// 出力: 値: second
// 出力: 値: third

5. 補足

オペレーター版との違い

オペレーター版 Concat は、拡張メソッドとして source.Concat(second) の形式で使用できます。2 つの Observable を直列につなぐ場合はオペレーター版、3 つ以上または動的なソース集合を順番に連結する場合は、この静的ファクトリメソッド版が向いています。