Skip to content

Prepend

1. 概要

Prepend は、ソース Observable シーケンスの先頭に 1 つ以上の要素を追加するオペレーターです。購読時にソースの要素より先に追加要素が発行されます。ファクトリ関数を使用するオーバーロードでは、要素の遅延生成が可能です。

2. シグネチャ

単一値オーバーロード

csharp
public static Observable<T> Prepend<T>(
    this Observable<T> source,
    T value)

購読時に、ソースの要素が発行される前に指定した単一の値を発行します。

IEnumerable オーバーロード

csharp
public static Observable<T> Prepend<T>(
    this Observable<T> source,
    IEnumerable<T> values)

購読時に、ソースの要素が発行される前に IEnumerable<T> の全要素を順番に発行します。

ファクトリ関数オーバーロード

csharp
public static Observable<T> Prepend<T>(
    this Observable<T> source,
    Func<T> valueFactory)

購読時にファクトリ関数を呼び出し、その戻り値をソースの前に発行します。遅延評価により、購読時点の最新の値を生成できます。

ステート付きファクトリ関数オーバーロード

csharp
public static Observable<T> Prepend<T, TState>(
    this Observable<T> source,
    TState state,
    Func<TState, T> valueFactory)

外部状態 TState を受け取るファクトリ関数を使用します。クロージャのアロケーションを回避しつつ、遅延評価が可能です。

overload の使い分け

オーバーロード用途
単一値固定値を 1 つ先頭に追加したい場合。
IEnumerable複数の固定値をまとめて先頭に追加したい場合。
ファクトリ関数購読時点で動的に値を生成したい場合。
ステート付きファクトリ関数動的な値生成でクロージャのアロケーションを避けたい場合。

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

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

購読時に追加要素が先に発行され、その後にソースシーケンスの要素が続きます。

4. サンプルコード

csharp
// 単一値の先頭追加
var source = new Subject<int>();

source.Prepend(0)
    .Subscribe(x => Console.WriteLine(x));
// 購読時に即座に出力: 0

source.OnNext(1);     // 1
source.OnNext(2);     // 2
source.OnCompleted();
csharp
// IEnumerable による複数値の先頭追加
var source = new Subject<string>();

source.Prepend(new[] { "Header1", "Header2" })
    .Subscribe(x => Console.WriteLine(x));
// 購読時に即座に出力: Header1, Header2

source.OnNext("Data"); // Data
source.OnCompleted();
csharp
// ファクトリ関数による遅延生成
var source = new Subject<int>();

source.Prepend(() => DateTime.Now.Second)
    .Subscribe(x => Console.WriteLine(x));
// 購読時点の秒数が先頭に追加される

source.OnNext(100);
source.OnCompleted();

5. 補足

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