Пример #1
0
        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);
        }
Пример #2
0
        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));
        }