/// <summary> /// Synchronous version /// </summary> /// <typeparam name="T"></typeparam> /// <param name="items"></param> /// <param name="topSize"></param> /// <returns></returns> public T[] GetTopN <T>(IEnumerable <T> items, int topSize) where T : IComparable <T> { BoundedOrderedQueue <T> queue = new BoundedOrderedQueue <T>(topSize); foreach (T i in items) { queue.Add(i); } return(queue.ToArray()); }
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()); }
public void Merge(BoundedOrderedQueue <T> ol) { }