public static IAsyncEnumerable <TSource> WhereAsync <TSource>(this IAsyncEnumerable <TSource> source, Func <TSource, int, Task <bool> > predicate) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); } return(Create(() => { var e = source.GetEnumerator(); var index = 0; var current = default(TSource); var cts = new CancellationTokenDisposable(); var d = Disposable.Create(cts, e); return Create(async ct => { var b = false; bool moveNext; do { moveNext = await e.MoveNext(cts.Token).ConfigureAwait(false); if (moveNext) { b = await predicate(e.Current, checked (index++)).ConfigureAwait(false); } } while (!b && moveNext); if (b) { current = e.Current; return true; } return false; }, () => current, d.Dispose, e ); })); }