using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
namespace ParallelExample
var numbers = Enumerable.Range(0, limit).ToList();
var watch = Stopwatch.StartNew();
var primeNumbersFromForeach = GetPrimeList(numbers);
var watchForParallel = Stopwatch.StartNew();
var primeNumbersFromParallelForeach = GetPrimeListWithParallel(numbers);
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.");
private static IList<int> GetPrimeList(IList<int> numbers) => numbers.Where(IsPrime).ToList();
private static IList<int> GetPrimeListWithParallel(IList<int> numbers)
var primeNumbers = new ConcurrentBag<int>();
Parallel.ForEach(numbers, number =>
primeNumbers.Add(number);
return primeNumbers.ToList();
private static bool IsPrime(int number)
for (var divisor = 2; divisor <= Math.Sqrt(number); divisor++)
if (number % divisor == 0)