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. マーブルダイアグラム
購読時に追加要素が先に発行され、その後にソースシーケンスの要素が続きます。
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 はシーケンスの末尾に要素を追加するオペレーターです。先頭ではなく末尾に追加したい場合はそちらを使用してください。