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?