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. マーブルダイアグラム
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); // Truecsharp
// 異なるシーケンスの比較(要素が異なる)
var source1 = new[] { 1, 2, 3 }.ToObservable();
var source2 = new[] { 1, 2, 4 }.ToObservable();
bool isEqual = await source1.SequenceEqualAsync(source2);
Console.WriteLine(isEqual); // Falsecsharp
// 長さが異なるシーケンスの比較
var source1 = new[] { 1, 2, 3 }.ToObservable();
var source2 = new[] { 1, 2 }.ToObservable();
bool isEqual = await source1.SequenceEqualAsync(source2);
Console.WriteLine(isEqual); // Falsecsharp
// カスタム比較子を使用(大文字小文字を無視)
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