LINQ Select
usually works like this:
IEnumerable<Task<int>> res = new[] {1,2,3}.Select(async i => i);
I would like to have the following though:
IEnumerable<int> res = new[] {1,2,3}.Select(async i => i);
This extension method helps to get it:
static class SelectAsync
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> source, Func<T, Task<TResult>> selector)
{
return source
.ToObservable()
.Select(value => Observable.FromAsync(() => selector(value)))
.Concat()
.ToEnumerable();
}
}
So the following is true:
public class AsyncSelect_Should
{
[Test]
public void Not_Block()
{
var src = new[] { 1, 2, 3 };
var res = src.Select(async i => i);
CollectionAssert.AreEqual(src, res);
}
}
There should be something bad, really bad about it. Does it? :)