gpt4 book ai didi

c# - 不可能两次运行 IAsyncEnumerable 的枚举?

转载 作者:行者123 更新时间:2023-12-03 15:55:09 29 4
gpt4 key购买 nike

运行 IAsyncEnumerable 的枚举两次不可能?
一次CountAsync已运行,await foreach不会枚举任何项目。为什么?AsyncEnumerator 上似乎没有重置方法.

var count = await itemsToImport.CountAsync();

await foreach (var importEntity in itemsToImport)
{
// won't run
}
数据来源:
private IAsyncEnumerable<TEntity> InternalImportFromStream(TextReader reader)
{
var csvReader = new CsvReader(reader, Config);

return csvReader.GetRecordsAsync<TEntity>();
}

最佳答案

这与重置 IAsyncEnumerator 无关。此代码尝试生成第二个 IAsyncEnumerator,就像 IEnumerable.GetEnumerator() 一样,它只能在某些类型的集合上使用。如果 Enumerable(异步与否)是对某种只进数据结构的抽象,则 GetEnumerator/GetAsyncEnumerator 将失败。

即使它没有失败,有时也很昂贵。例如,它可能会在每次枚举时运行数据库查询或访问远程 API。这就是为什么 IEnumerable/IAsyncEnumerable 使函数的公共(public)返回类型很差的原因,因为它们无法描述返回集合的功能,并且几乎唯一可以对值做的事情就是使用 .ToList/ToListAsync 实现它。

例如,这很好用:

static async IAsyncEnumerable<int> Col()
{
for (int i = 1; i <= 10; i++)
{
yield return i;
}
}
static void Main(string[] args)
{
Run().Wait();
}
static async Task Run()
{

var col = Col();

var count = await col.CountAsync();
await foreach (var dataPoint in col)
{
Console.WriteLine(dataPoint);
}
}

关于c# - 不可能两次运行 IAsyncEnumerable 的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60725323/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com