namespace OX.MapReduce { using System; using System.Linq; using System.Threading.Tasks; public static class MapReduce { public static Task Start(Func map, Func reduce, params TInput[] inputs) { var mapTasks = CreateMapTasks(map, inputs); var reduceTask = CreateReduceTask(reduce, mapTasks); return reduceTask; } private static Task CreateReduceTask(Func reduce, Task[] mapTasks) { return Task.Factory.ContinueWhenAll(mapTasks, tasks => PerformReduce(reduce, tasks)); } private static TResult PerformReduce(Func reduce, Task[] tasks) { var results = from task in tasks select task.Result; return reduce(results.ToArray()); } private static Task[] CreateMapTasks(Func map, TInput[] inputs) { var tasks = new Task[inputs.Length]; for (int i = 0; i < inputs.Length; ++i) { var input = inputs[i]; tasks[i] = Task.Factory.StartNew(() => map(input)); } return tasks; } } }