62

所以在 C#8 中我们增加了IAsyncEnumerable接口。

如果我们有一个普通的IEnumerable,我们可以制作一个List或几乎任何我们想要的其他集合。感谢那里的Linq。

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

好吧,现在我想将 my 转换IAsyncEnumerable为 a List,当然这也是异步的。这种情况下是否已经有 Linq 实现?如果没有,那我怎么能自己转换呢?

4

2 回答 2

107

当然-您只需要NuGet 包ToListAsync()中的方法。这是一个完整的例子:System.Linq.Async

项目文件:

<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";
    }
}
于 2019-12-17T19:02:12.580 回答
12

如果您不想引入 NuGet 包,这里是(可能类似于)包中提到的扩展方法:

public static class AsyncEnumerableExtensions
{
    public static async Task<List<T>> ToListAsync<T>(this IAsyncEnumerable<T> items,
        CancellationToken cancellationToken = default)
    {
        var results = new List<T>();
        await foreach (var item in items.WithCancellation(cancellationToken)
                                        .ConfigureAwait(false))
            results.Add(item);
        return results;
    }
}
于 2020-09-05T18:34:25.193 回答