Index
1. 概要
Index は、ソース Observable の各要素に 0 始まりのインデックスを付与するオペレーターです。Observable<Unit> に対してはインデックス番号のみを発行し、それ以外の型に対しては (index, value) のタプルとして発行します。
2. シグネチャ
Observable<Unit> 用オーバーロード
csharp
public static Observable<int> Index(
this Observable<Unit> source)Observable<Unit> を受け取り、各要素を 0 始まりのインデックス値(int)に変換して発行します。
ジェネリック型オーバーロード
csharp
public static Observable<(int Index, T Value)> Index<T>(
this Observable<T> source)各要素に 0 始まりのインデックスを付与し、(int Index, T Value) の ValueTuple として発行します。
overload の使い分け
| オーバーロード | 用途 |
|---|---|
Observable<Unit> 用 | イベント発生回数のカウントなど、値が不要でインデックスのみが必要な場合。 |
| ジェネリック型 | 元の値とインデックスの両方が必要な場合。 |
3. マーブルダイアグラム
ソースの各要素に対して、発行順に 0 から始まるインデックスが付与されます。
4. サンプルコード
csharp
// ジェネリック型:要素とインデックスのタプル
var source = new Subject<string>();
source.Index()
.Subscribe(x => Console.WriteLine($"Index={x.Index}, Value={x.Value}"));
source.OnNext("A"); // Index=0, Value=A
source.OnNext("B"); // Index=1, Value=B
source.OnNext("C"); // Index=2, Value=Ccsharp
// Observable<Unit> 用:インデックスのみ
var clicks = new Subject<Unit>();
clicks.Index()
.Subscribe(i => Console.WriteLine($"Click #{i}"));
clicks.OnNext(Unit.Default); // Click #0
clicks.OnNext(Unit.Default); // Click #1
clicks.OnNext(Unit.Default); // Click #2