using System.Collections.Generic;
using System.Threading.Tasks;
public static class MyExtensions
public static async Task<IEnumerable<T>> Where<T>(this IEnumerable<T> source, Func<T, Task<bool>> func)
var tasks = new List<Task<bool>>();
foreach (var element in source)
tasks.Add(func(element));
var results = await Task.WhenAll<bool>(tasks.ToArray());
var trueIndex = results.Select((x, index) => new
}).Where(x => x.x).Select(x => x.index).ToList();
var filterSource = source.Where((x, index) => trueIndex.Contains(index));
static async Task Main(string[] args)
var users = new List<User>{new User{Id = 1, Age = 18, Name = "Michael"}, new User{Id = 2, Age = 18, Name = "Mike"}, new User{Id = 3, Age = 5, Name = "Sunny"}, new User{Id = 4, Age = 70, Name = "John"}};
var result = await users.Where(async x => await TestAsync(x));
result.ToList().ForEach(x => Console.WriteLine(x.Id));
public static async Task<bool> TestAsync(User user)