¿Cuál es la forma correcta de usar métodos de tipo linq con IAsyncEnumerable?

8

No parece haber ningún soporte linq incluido para IAsyncEnumerable empaquetado con .NET Core. ¿Cuál es la forma correcta de poder hacer cosas simples como ToList y Count?

cubesnyc
fuente
44
Si solo va a llamar a ToList o Count, ¿cuál es el punto de usar un método de enumerador asíncrono?
stuartd el
44
¿Por qué está cerrado esto? Es una buena y clara pregunta.
Stuart
3
Vote para volver a abrir esto, la pregunta tiene mucho sentido y, como puede ver, tiene una respuesta directa
Stilgar, el
Gracias @Stilgar, no sabía que era una cosa 🙂
Stuart
Paquete System.Linq.Async Nuget.
Theodor Zoulias el

Respuestas:

7

Esta es una buena pregunta, ya que casi no hay elementos útiles en IntelliSense en IAsyncEnumerable<T> con la referencia implícita del marco que tendría con una aplicación .NET Core predeterminada.

Se espera que agregue el paquete System.Linq.Async(conocido como Ix Async, ver aquí ) como este:

<PackageReference Include="System.Linq.Async" Version="4.0.0" />

Entonces puedes usar CountAsync, o ToListAsync:

async IAsyncEnumerable<int> Numbers()
{
    yield return 1;
    await Task.Delay(100);
    yield return 2;
}

var count = await Numbers().CountAsync();
var myList = await Numbers().ToListAsync();

Como se señala en un comentario, estos métodos no son tan útiles en sí mismas, que deben utilizarse después de haber utilizado las características más potentes manteniendo sus datos como un flujo asíncrono, con cosas como SelectAwaity WhereAwaitetc ...

Stuart
fuente
Los métodos tienen usos tal como son. ¿Qué sucede si me entregan una API que es IAsyncEnumerable pero realmente no me importa su asincronicidad? ¿Debería forzarme a contarme a mí mismo (que probablemente sea lo que CountAsync hace de todos modos)?
Stilgar
Tiene que preocuparse por la asincronicidad de la misma, no puede optar por no participar, es lo mismo que un asyncmétodo. No lo bloquee, a menos que sepa absolutamente lo que está haciendo.
Stuart
Pero CountAsync no está bloqueando. Solo estás esperando la secuencia completa. Si espera-foreach y luego cuenta en una variable, tendría el mismo efecto.
Stilgar
Sí, creo que no entendí tu primer comentario entonces
Stuart