using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace ParallelFor
{
    class MyCollection
    {
        List<double> elements;

        public MyCollection() 
        {
            elements = new List<double>(); 

            // Werte einlesen
            String input = "";
            Console.WriteLine(" Werte eingeben (b zum Beenden): \n");

            while (true)
            {
                Console.Write(" Wert: ");
                input = Console.ReadLine();
   
                if (input == "b")
                    break;      // Schleife verlassen

                elements.Add( Convert.ToDouble(input) );
            }

            Console.WriteLine("\n");
        }

        public int Length 
        { 
            get { return elements.Count; }
        }

        // rechenintensive Methode, die ein einzelnes Element verändert
        public void TreatElement(int n)
        {
            // simuliere eine längere Tätigkeit
            Thread.SpinWait(Int32.MaxValue);
            elements[n] *= 2;
            Console.WriteLine(" " + n + ". Element wurde bearbeitet");
        }

        public override String ToString() 
        {
            String s = " ";
            foreach (int elem in elements)
                s += elem + " ";
            return s;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyCollection daten = new MyCollection();

            // Bearbeiten eines bestimmten Bereichs von Elementen
            int start = 0;
            int end   = daten.Length;
            Parallel.For(start, end, daten.TreatElement);

            Console.WriteLine("\n Die MyCollection:" + daten);
            Console.ReadLine();
        }
    }
}
