using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading.Tasks;
public static void Main()
var numbers = Enumerable.Range(0, limit).ToList();
var watch = Stopwatch.StartNew();
var primeNumbers = GetPrimeList(numbers);
var watch2 = Stopwatch.StartNew();
var primeNumbersFromParallel = GetPrimeListWithParallel(numbers);
Console.WriteLine($"Using Normal ForLoop, Total Time: {watch.ElapsedMilliseconds}, Total Prime: {primeNumbers.Count}");
Console.WriteLine($"Using Parallel ForEachLoop, Total Time: {watch2.ElapsedMilliseconds}, Total Prime: {primeNumbersFromParallel.Count}");
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)