public override bool Equals(Object obj)
            {
                //Check for null and compare run-time types.
                if (obj == null || !(obj is Int32Int32DateO))
                {
                    return(false);
                }
                Int32Int32DateO item = (Int32Int32DateO)obj;

                return(this.Int32Int32Date.Int1 == item.Int32Int32Date.Int1 &&
                       this.Int32Int32Date.Int2 == item.Int32Int32Date.Int2 &&
                       this.Int32Int32Date.Date1 == item.Int32Int32Date.Date1);
            }
        static void Main(string[] args)
        {
            Int32Int32DateO iid1 = new Int32Int32DateO(0, 1, new DateTime(2007, 6, 1, 8, 30, 52));
            Int32Int32DateO iid2 = new Int32Int32DateO(0, 1, new DateTime(2007, 6, 1, 8, 30, 52));

            if (iid1 == iid2)
            {
                Console.WriteLine("same");
            }
            if (iid1.Equals(iid2))
            {
                Console.WriteLine("equals");
            }
            // that are equal but not the same I don't override = so I have both features

            Int32Int32DateCollection int32Int32DateCollection = new Int32Int32DateCollection();

            // dont't have to repeat the key like Dictionary
            int32Int32DateCollection.Add(new Int32Int32DateO(0, 0, new DateTime(2008, 5, 1, 8, 30, 52)));
            int32Int32DateCollection.Add(new Int32Int32DateO(0, 1, new DateTime(2008, 6, 1, 8, 30, 52)));
            int32Int32DateCollection.Add(iid1);
            //this would thow a duplicate key error
            //int32Int32DateCollection.Add(iid2);
            //this would thow a duplicate key error
            //int32Int32DateCollection.Add(new Int32Int32DateO(0, 1, new DateTime(2008, 6, 1, 8, 30, 52)));
            Console.WriteLine("count");
            Console.WriteLine(int32Int32DateCollection.Count.ToString());
            // reference by ordinal postion (note the is not the long key)
            Console.WriteLine("oridinal");
            Console.WriteLine(int32Int32DateCollection[0].GetHashCode().ToString());
            // reference by index
            Console.WriteLine("index");
            Console.WriteLine(int32Int32DateCollection[0, 1, new DateTime(2008, 6, 1, 8, 30, 52)].GetHashCode().ToString());
            Console.WriteLine("foreach");
            foreach (Int32Int32DateO iio in int32Int32DateCollection)
            {
                Console.WriteLine(string.Format("HashCode {0} Int1 {1} Int2 {2} DateTime {3}", iio.GetHashCode(), iio.Int1, iio.Int2, iio.Date1));
            }
            Console.WriteLine("sorted by date");
            foreach (Int32Int32DateO iio in int32Int32DateCollection.OrderBy(x => x.Date1).ThenBy(x => x.Int1).ThenBy(x => x.Int2))
            {
                Console.WriteLine(string.Format("HashCode {0} Int1 {1} Int2 {2} DateTime {3}", iio.GetHashCode(), iio.Int1, iio.Int2, iio.Date1));
            }
            Console.ReadLine();
        }