转换IAsyncEnumerable到列表


18

因此,在C#8中,我们增加了IAsyncEnumerable接口。

如果我们有一个法线,IEnumerable我们可以制作一个List或几乎任何我们想要的其他收藏。感谢那里的Linq。

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

好吧,现在我想异步地将其转换IAsyncEnumerable为a List和this。该情况下已经有Linq实现了吗?如果没有,那我该如何转换呢?

Answers:


26

当然-您只需要该ToListAsync()方法,该方法位于System.Linq.AsyncNuGet包中。这是一个完整的示例:

项目文件:

<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:“收到错误”并没有提供太多信息。我建议您提出一个新问题,并提供一个完整的,可重复的示例
Jon Skeet

@JonSkeet,刚才复制了它。await iOrderedQueryable.ToListAsync(cancellationToken)添加nuget软件包后失败。我删除了nuget包后,错误消失了。
ca9163d9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.