将 IAsyncEnumerable 转换为列表
Convert IAsyncEnumerable to List
所以在 C#8 中我们添加了 IAsyncEnumerable
接口。
如果我们有一个普通的 IEnumerable
,我们可以制作一个 List
或几乎任何我们想要的其他集合。感谢那里的 Linq。
var range = Enumerable.Range(0, 100);
var list = range.ToList();
好吧,现在我想将我的 IAsyncEnumerable
转换为 List
,这当然是异步的。这种情况下是否已经有 Linq 实现?如果没有,那我怎么自己转换呢?
当然 - 您只需要 ToListAsync()
方法,它位于 System.Linq.Async
NuGet package 中。这是一个完整的例子:
项目文件:
<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";
}
}
如果您不想引入 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;
}
}
所以在 C#8 中我们添加了 IAsyncEnumerable
接口。
如果我们有一个普通的 IEnumerable
,我们可以制作一个 List
或几乎任何我们想要的其他集合。感谢那里的 Linq。
var range = Enumerable.Range(0, 100);
var list = range.ToList();
好吧,现在我想将我的 IAsyncEnumerable
转换为 List
,这当然是异步的。这种情况下是否已经有 Linq 实现?如果没有,那我怎么自己转换呢?
当然 - 您只需要 ToListAsync()
方法,它位于 System.Linq.Async
NuGet package 中。这是一个完整的例子:
项目文件:
<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";
}
}
如果您不想引入 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;
}
}