I am trying to find a fast way to speed the following for loops up. (just fun theory stuff)
I have the following program
using System;
using System.Collections;
using System.Diagnostics;
namespace SpeedTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch timer = new Stopwatch();
            timer.Start();
            ArrayList widgets = new ArrayList(50000);
            for (int i = 0; i < widgets.Capacity; i++)
            {
                widgets.Add(new Widget(i));
            }
            string ProcessingMessages = "";
            for (int i = 0; i < widgets.Count; i++)
            {
                Widget widgetToProcess = (Widget)widgets[i];
                ProcessingMessages += widgetToProcess.ProcessWidget();
                ProcessingMessages += "\r\n";
            }
            Console.WriteLine(ProcessingMessages);
            timer.Stop();
            Console.WriteLine(timer.Elapsed);
            Console.ReadLine();
        }
    }
    class Widget
    {
        public Widget()
        {
            this.CreatedDateTime = DateTime.Now;
        }
        public Widget(int ID) : this()
        {
            this.ID = ID;
        }
        public DateTime CreatedDateTime { get; set; }
        public int ID { get; set; }
        public string ProcessWidget()
        {
            int Z = this.ID + this.ID;
            string Message = "Widget ID " + this.ID;
            Message += " was created on ";
            Message += CreatedDateTime.Year + "-" + CreatedDateTime.Month + "-" + CreatedDateTime.Day + ", at ";
            Message += CreatedDateTime.Hour + ":" + CreatedDateTime.Minute + ", with a value of ";
            Message += Z.ToString();
            return Message;
        }
    }
}
How can I speed these for loops up within itself? I know that implementing parallelism would be useful, such as 
for (int i = 0; i < widgets.Count; i += 10)
            {
                Widget widgetToProcess1 = (Widget)widgets[i];
                Widget widgetToProcess2 = (Widget)widgets[i+1];
                Widget widgetToProcess3 = (Widget)widgets[i+2];
                Widget widgetToProcess4 = (Widget)widgets[i+3];
                Widget widgetToProcess5 = (Widget)widgets[i+4];
                Widget widgetToProcess6 = (Widget)widgets[i + 5];
                Widget widgetToProcess7 = (Widget)widgets[i + 6];
                Widget widgetToProcess8 = (Widget)widgets[i + 7];
                Widget widgetToProcess9 = (Widget)widgets[i + 8];
                Widget widgetToProcess10 = (Widget)widgets[i + 9];
                ProcessingMessages += widgetToProcess1.ProcessWidget() + "\r\n" +
                    widgetToProcess2.ProcessWidget() + "\r\n" +
                    widgetToProcess3.ProcessWidget() + "\r\n" +
                    widgetToProcess4.ProcessWidget() + "\r\n" +
                    widgetToProcess5.ProcessWidget() + "\r\n" +
                    widgetToProcess6.ProcessWidget() + "\r\n" +
                    widgetToProcess7.ProcessWidget() + "\r\n" +
                    widgetToProcess8.ProcessWidget() + "\r\n" +
                    widgetToProcess9.ProcessWidget() + "\r\n" +
                    widgetToProcess10.ProcessWidget() + "\r\n";
             }
However that is all manually written. I am trying to find a way to dynamically break apart a large task/array size and run those chunks faster.
Looking for some simple thoughts/concepts on this. Or, if there are better alternatives than using a for loop for this test. 
 
     
     
    