Skip to content

SequenceEqualAsync

1. 概要

SequenceEqualAsync は、2 つの Observable シーケンスが等しいかどうかを比較し、結果を Task<Boolean> として返すオペレーターです。両方のシーケンスの長さが同じで、対応する位置の要素がすべて等しい場合に true を返します。要素の不一致が見つかった時点で短絡評価(ショートサーキット)し、false を即座に返します。

2. シグネチャ

デフォルト等値比較によるシーケンス比較

csharp
public static Task<Boolean> SequenceEqualAsync<T>(
    this Observable<T> source,
    Observable<T> second,
    CancellationToken cancellationToken = default)

EqualityComparer<T>.Default を使用して各要素を比較します。

カスタム等値比較子によるシーケンス比較

csharp
public static Task<Boolean> SequenceEqualAsync<T>(
    this Observable<T> source,
    Observable<T> second,
    IEqualityComparer<T> comparer,
    CancellationToken cancellationToken = default)

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

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

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

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

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

2 つのシーケンスの要素をペアワイズで比較し、両方が完了した時点で比較結果(true / false)を単一の値として出力します。不一致が見つかった場合は即座に false を返します。

4. サンプルコード

csharp
// 等しいシーケンスの比較
var source1 = new[] { 1, 2, 3 }.ToObservable();
var source2 = new[] { 1, 2, 3 }.ToObservable();

bool isEqual = await source1.SequenceEqualAsync(source2);
Console.WriteLine(isEqual); // True
csharp
// 異なるシーケンスの比較(要素が異なる)
var source1 = new[] { 1, 2, 3 }.ToObservable();
var source2 = new[] { 1, 2, 4 }.ToObservable();

bool isEqual = await source1.SequenceEqualAsync(source2);
Console.WriteLine(isEqual); // False
csharp
// 長さが異なるシーケンスの比較
var source1 = new[] { 1, 2, 3 }.ToObservable();
var source2 = new[] { 1, 2 }.ToObservable();

bool isEqual = await source1.SequenceEqualAsync(source2);
Console.WriteLine(isEqual); // False
csharp
// カスタム比較子を使用(大文字小文字を無視)
var comparer = StringComparer.OrdinalIgnoreCase;
var source1 = new[] { "Hello", "World" }.ToObservable();
var source2 = new[] { "hello", "world" }.ToObservable();

bool isEqual = await source1.SequenceEqualAsync(source2, comparer);
Console.WriteLine(isEqual); // True