Skip to content

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. マーブルダイアグラム

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

ソースシーケンスの全要素が発行された後、完了の直前に追加要素が挿入されます。

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, Y
csharp
// ファクトリ関数による遅延生成
var source = new Subject<int>();

source.Append(() => DateTime.Now.Second)
    .Subscribe(x => Console.WriteLine(x));

source.OnNext(1);
source.OnCompleted(); // 完了時点の秒数が追加される

5. 補足

  • Prepend はシーケンスの先頭に要素を追加するオペレーターです。末尾ではなく先頭に追加したい場合はそちらを使用してください。