Перетворити IAsyncEnumerable у список


18

Так у C # 8 ми отримали додавання IAsyncEnumerableінтерфейсу.

Якщо у нас є звичайний, IEnumerableми можемо зробити з нього Listабо майже будь-яку іншу колекцію, яку ми хочемо з неї. Завдяки Linq там.

var range = Enumerable.Range(0, 100);
var list = range.ToList();

Ну а тепер я хочу перетворити своє IAsyncEnumerableна а, Listі це, звичайно, асинхронно. Чи вже є реалізації Linq для цього випадку? Якщо цього немає, то як я можу сам тоді його перетворити?

Відповіді:


26

Звичайно - вам просто потрібен ToListAsync()метод, який є в System.Linq.Asyncпакеті NuGet . Ось повний приклад:

Файл проекту:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Linq.Async" Version="4.0.0" />
  </ItemGroup>

</Project>

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        IAsyncEnumerable<string> sequence = GetStringsAsync();
        List<string> list = await sequence.ToListAsync();
        Console.WriteLine(list.Count);
    }

    static async IAsyncEnumerable<string> GetStringsAsync()
    {
        yield return "first";
        await Task.Delay(1000);
        yield return "second";
        await Task.Delay(1000);
        yield return "third";
    }
}

Дякую за це, цікаво, що він ще не є частиною .Net Core 3.1 Framework.
Двадцять

4
@Twenty: Як окремий пакет, його легко використовувати на платформах, що тягнуться назад.
Джон Скіт

@JonSkeet Він отримує помилку при використанні цього пакету та ядра Ado.Net.
ca9163d9

@ ca9163d9: "Виходить помилка" насправді не дає багато інформації. Я пропоную вам задати нове запитання з повним мінімальним відтворюваним прикладом .
Джон Скіт

@JonSkeet, відтворив це саме зараз. Не вдалося await iOrderedQueryable.ToListAsync(cancellationToken)після додавання пакету nuget. Помилка зникла після того, як я видалив пакунок nuget.
ca9163d9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.