IAsyncEnumerator
IAsyncEnumerator<T>
получают из
GetAsyncEnumerator
и освобождают через await using.
Шаг делает
MoveNextAsync,
значение -
Current.
await foreach вызывает их
сам; здесь - ручной цикл.
Синтаксис
await using IAsyncEnumerator<T> en = asyncEnumerable.GetAsyncEnumerator();
while (await en.MoveNextAsync())
{
T item = en.Current;
}
Пример
Давайте сложить элементы ручным циклом:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
int sum = 0;
await using IAsyncEnumerator<int> en = Seq().GetAsyncEnumerator();
while (await en.MoveNextAsync())
{
sum += en.Current;
}
int res = sum;
Console.WriteLine(res);
}
static async IAsyncEnumerable<int> Seq()
{
yield return 1;
yield return 2;
await Task.CompletedTask;
}
}
Результат выполнения кода:
3
Пример
Давайте прочитать первый элемент
после успешного MoveNextAsync:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
await using IAsyncEnumerator<int> en = Seq().GetAsyncEnumerator();
await en.MoveNextAsync();
int res = en.Current;
Console.WriteLine(res);
}
static async IAsyncEnumerable<int> Seq()
{
yield return 1;
yield return 2;
await Task.CompletedTask;
}
}
Результат выполнения кода:
1
Пример
Давайте дойти до конца и проверить
MoveNextAsync:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
await using IAsyncEnumerator<int> en = Seq().GetAsyncEnumerator();
await en.MoveNextAsync();
await en.MoveNextAsync();
bool res = await en.MoveNextAsync();
Console.WriteLine(res);
}
static async IAsyncEnumerable<int> Seq()
{
yield return 1;
yield return 2;
await Task.CompletedTask;
}
}
Результат выполнения кода:
False
Смотрите также
-
IAsyncEnumerable,
источник данных -
MoveNextAsync,
переход вперёд -
Current,
элемент на шаге -
IAsyncEnumerator,
интерфейс перечислителя