private IEnumerable <object> ReduceByKeyObjects(IPairReducer reducer, IEnumerable <object> currentObjects) { var resultsByKey = new ConcurrentDictionary <object, List <object> >(); Parallel.ForEach(currentObjects, o => GroupByKey(o, resultsByKey)); var results = new List <object>(); Parallel.ForEach(resultsByKey, o => ReduceByKey(reducer, o, results)); return(results); }
private void ReduceByKey(IPairReducer reducer, KeyValuePair <object, List <object> > item, List <object> results) { var type = reducer.GetType(); var inputType = item.Value[0].GetType(); var reduceFunction = type.GetMethod("Reduce", new[] { inputType, inputType }); var accumulator = Activator.CreateInstance(inputType); foreach (var value in item.Value) { accumulator = reduceFunction.Invoke(reducer, new[] { value, accumulator }); } results.Add(CreateTuple(item.Key, accumulator)); }