Skip to content

SumAsync

1. 概要

SumAsync は、Observable シーケンスの要素の合計値を計算し、その結果を Task<T> として返すオペレーターです。数値型(Int32Int64SingleDoubleDecimal)に対応しています。空のシーケンスの場合は 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 シーケンスの合計値を返します。Int64SingleDoubleDecimal にも同様のオーバーロードがあります。

セレクターによる射影後の合計

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 で数値に変換した結果の合計を返します。Int64SingleDoubleDecimal にも同様のオーバーロードがあります。

汎用数値型の合計

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)シーケンスが Int32Int64SingleDoubleDecimal の場合
型別の SumAsync(source, selector)要素の上記数値型プロパティを合計したい場合
汎用数値型の SumAsync(source)上記以外の数値演算対応型で合計したい場合
汎用数値型の SumAsync(source, selector)変換後の型が数値演算に対応する場合

各数値型のオーバーロード一覧:

数値型直接合計セレクター付き
Int32Task<Int32>Task<Int32>
Int64Task<Int64>Task<Int64>
SingleTask<Single>Task<Single>
DoubleTask<Double>Task<Double>
DecimalTask<Decimal>Task<Decimal>

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

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

シーケンスのすべての要素を累積加算し、完了時に合計値を単一の結果として出力します。

4. サンプルコード

csharp
// 基本的な使い方:整数シーケンスの合計
var source = new[] { 1, 2, 3, 4, 5 }.ToObservable();

int sum = await source.SumAsync();
Console.WriteLine(sum); // 15
csharp
// セレクターを使ってオブジェクトのプロパティを合計
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.7
csharp
// 空のシーケンスは 0 を返す
var empty = Observable.Empty<int>();

int sum = await empty.SumAsync();
Console.WriteLine(sum); // 0