Skip to content

Instantly share code, notes, and snippets.

@Warrenn
Last active April 27, 2020 07:58
Show Gist options
  • Save Warrenn/ca683ce59bc41abc586bc1aff7b2cccf to your computer and use it in GitHub Desktop.
Save Warrenn/ca683ce59bc41abc586bc1aff7b2cccf to your computer and use it in GitHub Desktop.
extension to append an array in parallel
public static IEnumerable<TAggregate> InParallel<TSource, TAggregate>(
this IEnumerable<TSource> source,
Func<TSource, Task<IEnumerable<TAggregate>>> parallelTask) =>
InParallel(source, parallelTask, k => k);
public static IEnumerable<TAggregate> InParallel<TSource, TAggregate, TKey>(
this IEnumerable<TSource> source,
Func<TSource, Task<IEnumerable<TAggregate>>> parallelTask,
Func<TSource,TKey> keySelector)
{
var concurrentDictionary = new ConcurrentDictionary<TKey, IEnumerable<TAggregate>>();
var enumerable = source
.Select(async i =>
{
var pResult = await parallelTask(i);
var key = keySelector(i);
concurrentDictionary.TryAdd(key, pResult);
});
Task.WaitAll(enumerable.ToArray());
var sortedDictionary = new SortedDictionary<TKey, IEnumerable<TAggregate>>();
foreach (var keyValuePair in concurrentDictionary)
{
sortedDictionary.Add(keyValuePair.Key, keyValuePair.Value);
}
return sortedDictionary.SelectMany(kp => kp.Value);
}
@Warrenn
Copy link
Author

Warrenn commented Apr 27, 2020

append a task in parallel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment