SumAsync
1. 概要
SumAsync は、Observable シーケンスの要素の合計値を計算し、その結果を Task<T> として返すオペレーターです。数値型(Int32、Int64、Single、Double、Decimal)に対応しています。空のシーケンスの場合は 0 を返します。
2. シグネチャ
数値シーケンスの直接合計
csharp
public static Task<Int32> SumAsync(
this Observable<Int32> source,
CancellationToken cancellationToken = default)
public static Task<Int64> SumAsync(
this Observable<Int64> source,
CancellationToken cancellationToken = default)
public static Task<Single> SumAsync(
this Observable<Single> source,
CancellationToken cancellationToken = default)
public static Task<Double> SumAsync(
this Observable<Double> source,
CancellationToken cancellationToken = default)
public static Task<Decimal> SumAsync(
this Observable<Decimal> source,
CancellationToken cancellationToken = default)Int32 シーケンスの合計値を返します。Int64、Single、Double、Decimal にも同様のオーバーロードがあります。
セレクターによる射影後の合計
csharp
public static Task<Int32> SumAsync<T>(
this Observable<T> source,
Func<T, Int32> selector,
CancellationToken cancellationToken = default)
public static Task<Int64> SumAsync<T>(
this Observable<T> source,
Func<T, Int64> selector,
CancellationToken cancellationToken = default)
public static Task<Single> SumAsync<T>(
this Observable<T> source,
Func<T, Single> selector,
CancellationToken cancellationToken = default)
public static Task<Double> SumAsync<T>(
this Observable<T> source,
Func<T, Double> selector,
CancellationToken cancellationToken = default)
public static Task<Decimal> SumAsync<T>(
this Observable<T> source,
Func<T, Decimal> selector,
CancellationToken cancellationToken = default)各要素を selector で数値に変換した結果の合計を返します。Int64、Single、Double、Decimal にも同様のオーバーロードがあります。
汎用数値型の合計
csharp
public static Task<T> SumAsync<T>(
this Observable<T> source,
CancellationToken cancellationToken = default)T が数値演算に対応する型の場合に、シーケンスの合計を同じ型で返します。
汎用数値型セレクターによる合計
csharp
public static Task<TResult> SumAsync<TSource, TResult>(
this Observable<TSource> source,
Func<TSource, TResult> selector,
CancellationToken cancellationToken = default)selector で取り出した TResult が数値演算に対応する型の場合に、その合計を TResult で返します。
オーバーロードの使い分け
| オーバーロード | 用途 |
|---|---|
型別の SumAsync(source) | シーケンスが Int32、Int64、Single、Double、Decimal の場合 |
型別の SumAsync(source, selector) | 要素の上記数値型プロパティを合計したい場合 |
汎用数値型の SumAsync(source) | 上記以外の数値演算対応型で合計したい場合 |
汎用数値型の SumAsync(source, selector) | 変換後の型が数値演算に対応する場合 |
各数値型のオーバーロード一覧:
| 数値型 | 直接合計 | セレクター付き |
|---|---|---|
Int32 | Task<Int32> | Task<Int32> |
Int64 | Task<Int64> | Task<Int64> |
Single | Task<Single> | Task<Single> |
Double | Task<Double> | Task<Double> |
Decimal | Task<Decimal> | Task<Decimal> |
3. マーブルダイアグラム
シーケンスのすべての要素を累積加算し、完了時に合計値を単一の結果として出力します。
4. サンプルコード
csharp
// 基本的な使い方:整数シーケンスの合計
var source = new[] { 1, 2, 3, 4, 5 }.ToObservable();
int sum = await source.SumAsync();
Console.WriteLine(sum); // 15csharp
// セレクターを使ってオブジェクトのプロパティを合計
var orders = new[]
{
new { Product = "商品A", Amount = 1200 },
new { Product = "商品B", Amount = 800 },
new { Product = "商品C", Amount = 1500 },
};
int totalAmount = await orders.ToObservable().SumAsync(o => o.Amount);
Console.WriteLine($"合計金額: {totalAmount}円"); // 合計金額: 3500円csharp
// Double 型の合計
var temperatures = new[] { 22.5, 25.3, 19.8, 28.1 }.ToObservable();
double totalTemp = await temperatures.SumAsync();
Console.WriteLine(totalTemp); // 95.7csharp
// 空のシーケンスは 0 を返す
var empty = Observable.Empty<int>();
int sum = await empty.SumAsync();
Console.WriteLine(sum); // 0