AverageAsync
1. 概要
AverageAsync は、Observable シーケンスの算術平均を計算し、その結果を Task として返すオペレーターです。数値型(Int32、Int64、Single、Double、Decimal)の直接的な平均計算と、セレクター関数を使って要素から数値を抽出して平均を計算する方法の両方をサポートします。シーケンスが空の場合は InvalidOperationException をスローします。
2. シグネチャ
数値シーケンスの直接平均
csharp
public static Task<Double> AverageAsync(
this Observable<Int32> source,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync(
this Observable<Int64> source,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync(
this Observable<Single> source,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync(
this Observable<Double> source,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync(
this Observable<Decimal> source,
CancellationToken cancellationToken = default)Int32 シーケンスの算術平均を Double で返します。Int64、Single、Double、Decimal に対しても同様のオーバーロードが存在し、戻り値はいずれも Double です。
セレクター関数による平均
csharp
public static Task<Double> AverageAsync<T>(
this Observable<T> source,
Func<T, Int32> selector,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync<T>(
this Observable<T> source,
Func<T, Int64> selector,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync<T>(
this Observable<T> source,
Func<T, Single> selector,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync<T>(
this Observable<T> source,
Func<T, Double> selector,
CancellationToken cancellationToken = default)
public static Task<Double> AverageAsync<T>(
this Observable<T> source,
Func<T, Decimal> selector,
CancellationToken cancellationToken = default)selector で各要素から数値を抽出し、その平均を計算します。Int32、Int64、Single、Double、Decimal の各セレクター版が用意されています。
汎用数値型の平均
csharp
public static Task<Double> AverageAsync<T>(
this Observable<T> source,
CancellationToken cancellationToken = default)T が数値演算に対応する型の場合に、シーケンスの平均を計算します。
汎用数値型セレクターによる平均
csharp
public static Task<Double> AverageAsync<TSource, TResult>(
this Observable<TSource> source,
Func<TSource, TResult> selector,
CancellationToken cancellationToken = default)selector で取り出した TResult が数値演算に対応する型の場合に、その平均を計算します。
オーバーロードの使い分け
| オーバーロード | 用途 |
|---|---|
| 型別の直接平均 | ソースが Int32、Int64、Single、Double、Decimal の Observable の場合 |
| 型別のセレクター付き | 任意の型の Observable から上記の数値型プロパティを抽出して平均を計算する場合 |
| 汎用数値型の直接平均 | 上記以外の数値演算対応型で平均を計算する場合 |
| 汎用数値型のセレクター付き | 変換後の型が数値演算に対応する場合 |
各型別オーバーロードの戻り値:
| 入力またはセレクターの戻り値 | 戻り値 |
|---|---|
Int32 | Task<Double> |
Int64 | Task<Double> |
Single | Task<Double> |
Double | Task<Double> |
Decimal | Task<Double> |
3. マーブルダイアグラム
ソースシーケンスの全要素を蓄積し、OnCompleted 時に算術平均が Task の結果として返されます。
4. サンプルコード
csharp
// Int32 シーケンスの平均
var source = new[] { 10, 20, 30, 40, 50 }.ToObservable();
double average = await source.AverageAsync();
Console.WriteLine(average); // 30csharp
// セレクター関数を使用
var students = Observable.Create<(string Name, int Score)>(observer =>
{
observer.OnNext(("Alice", 85));
observer.OnNext(("Bob", 92));
observer.OnNext(("Charlie", 78));
observer.OnCompleted();
return Disposable.Empty;
});
double avgScore = await students.AverageAsync(s => s.Score);
Console.WriteLine(avgScore); // 85csharp
// Decimal シーケンスの平均
var prices = new[] { 19.99m, 29.99m, 9.99m }.ToObservable();
double avgPrice = await prices.AverageAsync();
Console.WriteLine(avgPrice); // 19.99