using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace ParallelExample { class Program { static void Main() { // 2 million var limit = 2_000_000; var numbers = Enumerable.Range(0, limit).ToList(); var watch = Stopwatch.StartNew(); var primeNumbersFromForeach = GetPrimeList(numbers); watch.Stop(); var watchForParallel = Stopwatch.StartNew(); var primeNumbersFromParallelForeach = GetPrimeListWithParallel(numbers); watchForParallel.Stop(); Console.WriteLine($"Classical foreach loop | Total prime numbers : {primeNumbersFromForeach.Count} | Time Taken : {watch.ElapsedMilliseconds} ms."); Console.WriteLine($"Parallel.ForEach loop | Total prime numbers : {primeNumbersFromParallelForeach.Count} | Time Taken : {watchForParallel.ElapsedMilliseconds} ms."); Console.WriteLine("Press any key to exit."); Console.ReadLine(); } /// /// GetPrimeList returns Prime numbers by using sequential ForEach /// /// /// private static IList GetPrimeList(IList numbers) => numbers.Where(IsPrime).ToList(); /// /// GetPrimeListWithParallel returns Prime numbers by using Parallel.ForEach /// /// /// private static IList GetPrimeListWithParallel(IList numbers) { var primeNumbers = new ConcurrentBag(); Parallel.ForEach(numbers, number => { if (IsPrime(number)) { primeNumbers.Add(number); } }); return primeNumbers.ToList(); } /// /// IsPrime returns true if number is Prime, else false.(https://en.wikipedia.org/wiki/Prime_number) /// /// /// private static bool IsPrime(int number) { if (number < 2) { return false; } for (var divisor = 2; divisor <= Math.Sqrt(number); divisor++) { if (number % divisor == 0) { return false; } } return true; } } }