public List <T> FindElements(ElementSeeker delgate) { var lockObject = new object(); var result = new List <T>(); Parallel.ForEach( _data.Where(_ => _ != null), () => new List <T>(), delegate(T[] shard, ParallelLoopState state, long arg3, List <T> arg4) { for (var i = 0; i < shard.Length; i++) { if (shard[i] != null && delgate(shard[i])) { arg4.Add(shard[i]); } } return(arg4); }, delegate(List <T> local) { lock (lockObject) { result.AddRange(local); } }); return(result); }
/// <summary> /// Find elements by scanning the list /// </summary> /// <param name="seeker">A delegate to search for the right element</param> /// <returns>A list of matching graph elements</returns> private List <AGraphElement> FindElements(ElementSeeker seeker) { return(_graphElements.AsParallel() .Where(_ => _ != null && seeker(_)) .ToList()); }