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 は最初のソースのすべての値を転送し、そのソースが完了すると次のソースを購読します。これをすべてのソースが完了するまで繰り返します。
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
// 出力: 値: third5. 補足
オペレーター版との違い
オペレーター版 Concat は、拡張メソッドとして source.Concat(second) の形式で使用できます。2 つの Observable を直列につなぐ場合はオペレーター版、3 つ以上または動的なソース集合を順番に連結する場合は、この静的ファクトリメソッド版が向いています。