Start here. This is the direct spoken answer to practice first.
Why this question matters
Parallel computation is often correct until every worker writes into the same result object. The aggregation strategy is part of the algorithm, not cleanup after parallelization.
I would avoid calling List<T>.Add or mutating one normal dictionary from multiple workers. If every input has a known output index, workers can write distinct slots in a preallocated array. For a scalar counter or sum, an Interlocked operation may be enough. For richer aggregation, I would prefer local accumulators per partition and combine them at the end, or use a supported PLINQ aggregate. A concurrent collection is useful when unordered item collection is the real requirement, but it still has synchronization cost.