MinAsync
1. 概要
MinAsync は、Observable シーケンス内の最小値を求め、その結果を Task<T> として返すオペレーターです。シーケンスが完了するまですべての要素を評価します。シーケンスが空の場合は InvalidOperationException をスローします。
2. シグネチャ
デフォルト比較による最小値
csharp
public static Task<T> MinAsync<T>(
this Observable<T> source,
CancellationToken cancellationToken = default)
where T : IComparable<T>型パラメーター T が IComparable<T> を実装している場合に使用できます。
セレクターによる射影後の最小値
csharp
public static Task<TResult> MinAsync<T, TResult>(
this Observable<T> source,
Func<T, TResult> selector,
CancellationToken cancellationToken = default)
where TResult : IComparable<TResult>各要素を selector で変換した結果から最小値を求めます。
カスタム比較子による最小値
csharp
public static Task<T> MinAsync<T>(
this Observable<T> source,
IComparer<T> comparer,
CancellationToken cancellationToken = default)IComparer<T> を指定して、独自の比較ロジックで最小値を判定します。
セレクター + カスタム比較子による最小値
csharp
public static Task<TResult> MinAsync<T, TResult>(
this Observable<T> source,
Func<T, TResult> selector,
IComparer<TResult> comparer,
CancellationToken cancellationToken = default)各要素を selector で変換した結果を、指定した IComparer<TResult> で比較して最小値を求めます。
オーバーロードの使い分け
| オーバーロード | 用途 |
|---|---|
MinAsync(source) | 要素自体が IComparable<T> を実装している場合 |
MinAsync(source, selector) | 要素の特定のプロパティから最小値を求めたい場合 |
MinAsync(source, comparer) | カスタム比較ロジックを使いたい場合 |
MinAsync(source, selector, comparer) | 変換後の値にカスタム比較ロジックを使いたい場合 |
3. マーブルダイアグラム
シーケンスのすべての要素を収集し、完了時に最小値を単一の結果として出力します。
4. サンプルコード
csharp
// 基本的な使い方:数値シーケンスの最小値
var source = Observable.Create<int>(observer =>
{
observer.OnNext(3);
observer.OnNext(7);
observer.OnNext(2);
observer.OnNext(9);
observer.OnNext(5);
observer.OnCompleted();
return Disposable.Empty;
});
int min = await source.MinAsync();
Console.WriteLine(min); // 2csharp
// セレクターを使ってオブジェクトのプロパティから最小値を取得
var products = new[]
{
new { Name = "商品A", Price = 1200 },
new { Name = "商品B", Price = 800 },
new { Name = "商品C", Price = 1500 },
};
int minPrice = await products.ToObservable().MinAsync(p => p.Price);
Console.WriteLine(minPrice); // 800csharp
// カスタム比較子を使用
var comparer = Comparer<string>.Create((a, b) => a.Length.CompareTo(b.Length));
string shortest = await new[] { "apple", "hi", "watermelon" }
.ToObservable()
.MinAsync(comparer);
Console.WriteLine(shortest); // hicsharp
// セレクターとカスタム比較子を併用
var words = new[] { "apple", "HI", "Watermelon" }.ToObservable();
var comparer = StringComparer.OrdinalIgnoreCase;
string minWord = await words.MinAsync(x => x, comparer);
Console.WriteLine(minWord); // apple