I'm trying to do something like this:

    var loudDogs = dogs.Where(async d => await d.IsYappyAsync);

The "IsYappyAsync" property would return a `Task<bool>`.

Obviously this isn't supported, so instead I've built an extension method called WhereAsync.

    public static async Task<IEnumerable<T>> WhereAsync<T>(this IEnumerable<T> items, Func<T, Task<bool>> predicate)
    {
        var results = new List<T>();
        var tasks = new List<Task<bool>>();
    
        foreach (var item in items)
        {
            var task = predicate.Invoke(item);
            tasks.Add(task);
        }
    
        var predicateResults = await Task.WhenAll<bool>(tasks);
    
        var counter = 0;
        foreach (var item in items)
        {
            var predicateResult = predicateResults.ElementAt(counter);
    
            if (predicateResult)
                results.Add(item);
                    
            counter++;
        }
    
        return results.AsEnumerable();
    }

This probably isn't the best approach, but I'm at a loss for something better. Any thoughts?