Skip to content

ToHashSetAsync

1. 概要

ToHashSetAsync は、Observable シーケンスのすべての要素を収集し、HashSet<T>Task<HashSet<T>> として返すオペレーターです。重複する要素は自動的に除去されます。シーケンスが完了するまで要素をバッファリングします。

2. シグネチャ

デフォルト等値比較によるハッシュセット変換

csharp
public static Task<HashSet<T>> ToHashSetAsync<T>(
    this Observable<T> source,
    CancellationToken cancellationToken = default)

EqualityComparer<T>.Default を使用して重複を判定します。

カスタム等値比較子によるハッシュセット変換

csharp
public static Task<HashSet<T>> ToHashSetAsync<T>(
    this Observable<T> source,
    IEqualityComparer<T> comparer,
    CancellationToken cancellationToken = default)

IEqualityComparer<T> を指定して、独自の等値比較ロジックで重複を判定します。

オーバーロードの使い分け

オーバーロード用途
ToHashSetAsync(source)デフォルトの等値比較で十分な場合
ToHashSetAsync(source, comparer)カスタム比較ロジックが必要な場合

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

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

シーケンスのすべての要素を収集し、重複を除去した上で、完了時にハッシュセットを単一の結果として出力します。

4. サンプルコード

csharp
// 基本的な使い方:重複を除去してハッシュセットに変換
var source = new[] { 1, 2, 3, 2, 1, 4, 3 }.ToObservable();

HashSet<int> set = await source.ToHashSetAsync();
Console.WriteLine(set.Count);    // 4
Console.WriteLine(set.Contains(3)); // True
csharp
// カスタム比較子を使用(大文字小文字を無視)
var words = new[] { "Hello", "World", "hello", "WORLD" }.ToObservable();

HashSet<string> set = await words.ToHashSetAsync(StringComparer.OrdinalIgnoreCase);
Console.WriteLine(set.Count); // 2
csharp
// 空のシーケンスは空のハッシュセットを返す
var empty = await Observable.Empty<int>().ToHashSetAsync();
Console.WriteLine(empty.Count); // 0