protected override double? InternalAggregate(ref Exception singularExceptionToThrow)
{
// Because the final reduction is typically much cheaper than the intermediate
// reductions over the individual partitions, and because each parallel partition
// will do a lot of work to produce a single output element, we prefer to turn off
// pipelining, and process the final reductions serially.
using (IEnumerator<Pair<double, long>> enumerator = GetEnumerator(ParallelMergeOptions.FullyBuffered, true))
{
// If the sequence was empty, return null right away.
if (!enumerator.MoveNext())
{
return null;
}
Pair<double, long> result = enumerator.Current;
// Simply add together the sums and totals.
while (enumerator.MoveNext())
{
checked
{
result.First += enumerator.Current.First;
result.Second += enumerator.Current.Second;
}
}
// And divide the sum by the total to obtain the final result.
return result.First / result.Second;
}
}