public T[] GetTopNPar <T>(IEnumerable <T> items, int topSize) where T : IComparable <T> { BoundedOrderedQueue <T> queue = new BoundedOrderedQueue <T>(topSize); object monitor = new object(); Parallel.ForEach( items, () => new BoundedOrderedQueue <T>(topSize), // initial state (it, state, partial) => { // local body partial.Add(it); return(partial); }, (p) => { // final aggregation lock (monitor) queue.Merge(p); }); return(queue.ToArray()); }
public T[] ParallelForGetTopN <T>(IEnumerable <T> items, int topSize) where T : IComparable <T> { BoundedOrderedQueue <T> boundedOrderedQueue = new BoundedOrderedQueue <T>(topSize); Parallel.ForEach(items, () => new BoundedOrderedQueue <T>(1), (item, state, queue) => { queue.Add(item); return(queue); }, queue => { lock (queue) { boundedOrderedQueue.Merge(queue); } }); return(boundedOrderedQueue.ToArray()); }