Append
1. 概要
Append は、ソース Observable シーケンスの末尾に 1 つ以上の要素を追加するオペレーターです。ソースの全要素が発行された後、完了の直前に追加要素が発行されます。ファクトリ関数を使用するオーバーロードでは、要素の遅延生成が可能です。
2. シグネチャ
単一値オーバーロード
csharp
public static Observable<T> Append<T>(
this Observable<T> source,
T value)ソースの完了直前に、指定した単一の値を追加します。
IEnumerable オーバーロード
csharp
public static Observable<T> Append<T>(
this Observable<T> source,
IEnumerable<T> values)ソースの完了直前に、IEnumerable<T> の全要素を順番に追加します。
ファクトリ関数オーバーロード
csharp
public static Observable<T> Append<T>(
this Observable<T> source,
Func<T> valueFactory)ソースの完了直前にファクトリ関数を呼び出し、その戻り値を追加します。遅延評価により、追加時点の最新の値を生成できます。
ステート付きファクトリ関数オーバーロード
csharp
public static Observable<T> Append<T, TState>(
this Observable<T> source,
TState state,
Func<TState, T> valueFactory)外部状態 TState を受け取るファクトリ関数を使用します。クロージャのアロケーションを回避しつつ、遅延評価が可能です。
overload の使い分け
| オーバーロード | 用途 |
|---|---|
| 単一値 | 固定値を 1 つ追加したい場合。 |
IEnumerable | 複数の固定値をまとめて追加したい場合。 |
| ファクトリ関数 | 追加時点で動的に値を生成したい場合。 |
| ステート付きファクトリ関数 | 動的な値生成でクロージャのアロケーションを避けたい場合。 |
3. マーブルダイアグラム
ソースシーケンスの全要素が発行された後、完了の直前に追加要素が挿入されます。
4. サンプルコード
csharp
// 単一値の追加
var source = new Subject<int>();
source.Append(99)
.Subscribe(x => Console.WriteLine(x));
source.OnNext(1); // 1
source.OnNext(2); // 2
source.OnCompleted(); // 99(完了直前に追加)csharp
// IEnumerable による複数値の追加
var source = new Subject<string>();
source.Append(new[] { "X", "Y" })
.Subscribe(x => Console.WriteLine(x));
source.OnNext("A"); // A
source.OnCompleted(); // X, Ycsharp
// ファクトリ関数による遅延生成
var source = new Subject<int>();
source.Append(() => DateTime.Now.Second)
.Subscribe(x => Console.WriteLine(x));
source.OnNext(1);
source.OnCompleted(); // 完了時点の秒数が追加される5. 補足
- Prepend はシーケンスの先頭に要素を追加するオペレーターです。末尾ではなく先頭に追加したい場合はそちらを使用してください。