using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AsyncTester { class Program { public static async Task Main() { await GetInts() .AsyncSelect(x => { Console.WriteLine($"Selecting {x}"); return (x * 2).ToString(); // even convert type }) .AsyncForeach(x => Console.WriteLine(x)); // C# 8 version, how to select/map data? var enumerable = GetIntsAsync(); await foreach (var i in enumerable) { Console.WriteLine(i); } } // C# 8 version public static async IAsyncEnumerable<int> GetIntsAsync() { foreach (var item in Enumerable.Range(0, 10)) { await Task.Delay(100); yield return item; } } public static IEnumerable<Task<int>> GetInts() { foreach (var item in Enumerable.Range(0, 10)) yield return Task.FromResult(item); } } public static class AsyncHelper { public static async Task AsyncForeach<T>(this IEnumerable<Task<T>> data, Action<T> action) { foreach (var item in data) action(await item.ConfigureAwait(false)); } public static IEnumerable<Task<U>> AsyncSelect<T, U>(this IEnumerable<Task<T>> data, Func<T, U> transform) { foreach (var item in data) yield return Task.Run(async () => transform(await item)); } } }
325700cookie-checkC# Async Select+ForEach with yield-return