¿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?


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

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 ...


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.