Невозможно выполнить перечисление 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>();
}
.Reset()
;IAsyncEnumerator
просто систематизирует практику, которую вы не можете перечислить более одного раза. Что касаетсяIAsyncEnumerable
, то же самое, что и дляIEnumerable
: возможно ли перечисление более одного раза, не определено в интерфейсе, но для многих источников вы не можете этого сделать, потому что это может привести к скрытому снижению производительности или непоследовательным результатам (например, выполнение базы данных запрос дважды). Вы должны иметь дело с этим явно, что означает, что вы должны либо материализовать результат (.ToList()
и т.п.), либо повторить операцию самостоятельно. - person Jeroen Mostert   schedule 17.03.2020.Reset()
, даже если он существует, требует, чтобы результаты где-то буферизовались или все было переделано. Если вы хотите буферизовать / повторить их самостоятельно, вы можете, но вы не можете ожидать, что источник сделает это за вас, если вы захотите дождаться подсчета. Коллекции реализуют свои собственные.Count
свойства, которые вы можете использовать для непосредственного получения счетчика; аналогичный механизм можно использовать для других источников, в зависимости от их характера (например, отдельныйCount
вызов веб-API). - person Jeroen Mostert   schedule 17.03.2020IAsyncEnumerable
, а из-за базового типа, который его реализует. Я рекомендую прочитать эту статью. Есть пример, который работает независимо от того, сколько раз он повторяется: docs.microsoft.com/en-us/archive/msdn-magazine/2019/november/ - person Fabjan   schedule 17.03.2020