static void Test()
        {
            double[] array = new double[100];

            for (int i = 0; i < array.Length; ++i)
            {
                array[i] = i;
            }

            double sum1 = array.Aggregate((total, current) => total + Math.Sqrt(Math.Abs(Math.Sin(current))));

            Console.WriteLine("Linq aggregate = " + sum1);

            IParallelEnumerable <double> parray = array.AsParallel();

            double sum2 = parray.Aggregate
                          (
                0.0,
                (total1, current1) => total1 + Math.Sqrt(Math.Abs(Math.Sin(current1))),
                (total2, current2) => total2 + current2,
                acc => acc
                          );

            Console.WriteLine("Plinq aggregate = " + sum2);
        }
            public Enumerator(IParallelEnumerable <T> source, Func <T, bool> predicate)
            {
                items = new List <Item>();
                ParameterizedThreadStart threadStart =
                    (object o) =>
                {
                    Item item = (Item)o;
                    if (predicate(item.val))
                    {
                        item.valid = true;
                    }
                };

                foreach (var s in source)
                {
                    var  t    = new Thread(threadStart);
                    Item item = new Item(t, s);
                    items.Add(item);
                    t.Start(item);
                }
                itemEnumerator = items.GetEnumerator();
            }
 public ChessEnumerable(IParallelEnumerable <T> e, Func <T, bool> predicate)
 {
     this.e         = e;
     this.predicate = predicate;
 }