static void Main(string[] args)
        {
            var list = new List <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                List.Add(CustomObject.Get(i));
                list.Add(CustomObject.Get(i));
            }

            var dictionary = new Dictionary <string, CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                dictionary.Add(i.ToString(), list[i]);
            }
            ;

            var list2 = new List <CustomObjectNoFields>();

            for (int i = 0; i < COUNT; i++)
            {
                list2.Add(new CustomObjectNoFields()
                {
                    Property1 = string.Format("Property {0}", i),
                    Property2 = i
                });
            }

            var list3 = new List <CustomObjectNoProperties>();

            for (int i = 0; i < COUNT; i++)
            {
                list3.Add(new CustomObjectNoProperties()
                {
                    Field1 = string.Format("Field {0}", i),
                    Field2 = i
                });
            }

            var list4 = new List <CustomObjectNoPropertiesOrFields>();

            for (int i = 0; i < COUNT; i++)
            {
                list4.Add(new CustomObjectNoPropertiesOrFields());
            }

            var dictionary2 = new Dictionary <CustomObject, CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                dictionary2.Add(CustomObject.Get(i), CustomObject.Get(i));
            }
            ;

            var array = new CustomObject[COUNT];

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

            var arrayList = new ArrayList();

            for (int i = 0; i < COUNT; i++)
            {
                arrayList.Add(CustomObject.Get(i));
            }

            var bitArray           = new BitArray(new bool[] { false, false, false, true, true, false, true });
            var blockingCollection = new BlockingCollection <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                blockingCollection.Add(CustomObject.Get(i));
            }

            var concurrentBag = new ConcurrentBag <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                concurrentBag.Add(CustomObject.Get(i));
            }

            var concurrentDictionary = new ConcurrentDictionary <CustomObject, CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                concurrentDictionary.TryAdd(CustomObject.Get(i), CustomObject.Get(i));
            }

            var concurrentQueue = new ConcurrentQueue <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                concurrentQueue.Enqueue(CustomObject.Get(i));
            }

            var concurrentStack = new ConcurrentStack <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                concurrentStack.Push(CustomObject.Get(i));
            }

            var linkedList = new LinkedList <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                linkedList.AddLast(CustomObject.Get(i));
            }

            var stack1 = new Stack <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                stack1.Push(CustomObject.Get(i));
            }

            var stack2 = new Stack();

            for (int i = 0; i < COUNT; i++)
            {
                stack2.Push(CustomObject.Get(i));
            }

            var sortedList1 = new SortedList();

            for (int i = 0; i < COUNT; i++)
            {
                sortedList1.Add(i, CustomObject.Get(i));
            }

            var sortedList2 = new SortedList <CustomObject, CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                sortedList2.Add(CustomObject.Get(i), CustomObject.Get(i));
            }

            var sortedSet = new SortedSet <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                sortedSet.Add(CustomObject.Get(i));
            }

            var queue1 = new Queue();

            for (int i = 0; i < COUNT; i++)
            {
                queue1.Enqueue(CustomObject.Get(i));
            }

            var queue2 = new Queue <CustomObject>();

            for (int i = 0; i < COUNT; i++)
            {
                queue2.Enqueue(CustomObject.Get(i));
            }

            var dataTable = new DataTable();

            dataTable.Columns.Add("Column1");
            dataTable.Columns.Add("Column2");
            dataTable.Rows.Add(1, 2);
            dataTable.Rows.Add(11, 22);
            var dataRow             = dataTable.Rows[0];
            var twoDimentionalArray = new object[][] { new object[] { 1, default(IntPtr) } };

            arrayList.Add(1);
            var bindingList     = new BindingList <CustomObject>(list);
            var valueCollection = new Dictionary <string, CustomObject> .ValueCollection(dictionary);

            var form = new Form();

            form.Controls.Add(new System.Windows.Forms.TextBox());
            form.Controls.Add(new System.Windows.Forms.TextBox());
            var controlCollection   = form.Controls;
            var oneDimentionalArray = new CustomObject[] { new CustomObject(), new CustomObject() };
            var hashSet             = new HashSet <CustomObject>(list);
            var iList = bindingList as IList <CustomObject>;
            IEnumerable <object> iEnumerable = bindingList as IEnumerable <object>;
            var whereSelectListIterator      = list.Where(x => x != null).Select(x => x);
            var whereSelectArrayIterator     = array.Where(x => x != null).Select(x => x);
            var whereArrayIterator           = array.Where(x => x != null);
            var whereEnumerableIterator      = iEnumerable.Where(x => x != null);
            var whereListIterator            = array.Where(x => x != null);
            var selectEnumerableIterator     = iEnumerable.Select(x => x);
            var selectArrayIterator          = array.Select(x => x);
            var selectListIterator           = list.Select(x => x);
            var selectIListIterator          = iList.Select(x => x);

            Console.WriteLine(selectIListIterator);
            Console.WriteLine(selectListIterator);
            Console.WriteLine(selectArrayIterator);
            Console.WriteLine(selectEnumerableIterator);
            Console.WriteLine(whereListIterator);
            Console.WriteLine(whereEnumerableIterator);
            Console.WriteLine(whereArrayIterator);
            Console.WriteLine(whereSelectArrayIterator);
            Console.WriteLine(whereSelectListIterator);
            Console.WriteLine(iEnumerable);
            Console.WriteLine(hashSet);
            Console.WriteLine(oneDimentionalArray);
            Console.WriteLine(controlCollection);
            Console.WriteLine(valueCollection);
            Console.WriteLine(bindingList);
            Console.WriteLine(dataRow);
            Console.WriteLine(list);
            Console.WriteLine(dictionary);
            Console.WriteLine(list2);
            Console.WriteLine(list3);
            Console.WriteLine(list4);
            Console.WriteLine(dictionary2);
            Console.WriteLine(array);
            Console.WriteLine(arrayList);
            Console.WriteLine(bitArray);
            Console.WriteLine(blockingCollection);
            Console.WriteLine(concurrentBag);
            Console.WriteLine(concurrentDictionary);
            Console.WriteLine(concurrentQueue);
            Console.WriteLine(concurrentStack);
            Console.WriteLine(linkedList);
            Console.WriteLine(stack1);
            Console.WriteLine(stack2);
            Console.WriteLine(sortedList1);
            Console.WriteLine(sortedList2);
            Console.WriteLine(sortedSet);
            Console.WriteLine(queue1);
            Console.WriteLine(queue2);
            Console.WriteLine(twoDimentionalArray);
            Console.WriteLine(dataTable.Rows);

            //todo: test
            //var collectionBase = _ as CollectionBase;
            //Console.WriteLine(collectionBase);
            //var dictionaryBase = dictionary as DictionaryBase;
            //Console.WriteLine(dictionaryBase);
        }