/*public static IEnumerable<IGrouping<K, T>> GroupBy<T, K, E>(
         * 	this IEnumerable<T> source,
         * 	Func<T, K> keySelector,
         * 	Func<T, E> elementSelector.
         * 	IEqualityComparer<K> comparer);
         * */
        void GroupByOperator4th()
        {
            MyFounderNumberComparer comp = new MyFounderNumberComparer ();
            EmployeeOptionEntry[] emOptions = EmployeeOptionEntry.GetEmployeeOptionEntries ();

            IEnumerable<IGrouping<int, DateTime>> opts = emOptions
                .GroupBy (key => key.id, element => element.dateAwarded, comp);

            foreach (IGrouping<int, DateTime> keyGroup in opts) {
                Console.WriteLine("Option dates for: " + (comp.isFounder(keyGroup.Key) ? "founder" : "nonfounder"));

                foreach(DateTime date in keyGroup)
                {
                    Console.WriteLine(date.ToShortDateString());
                }
            }
        }
        /*public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>(
         * 	this IEnumerable<T> source,
         * 	Func<T, K> keySelector,
         * 	IEqualityComparer<K> comparer);
         * */
        void GroupByOperator2nd()
        {
            MyFounderNumberComparer comp = new MyFounderNumberComparer();

            EmployeeOptionEntry[] emOptions = EmployeeOptionEntry.GetEmployeeOptionEntries();

            IEnumerable<IGrouping<int, EmployeeOptionEntry>> opts = emOptions
                .GroupBy(o => o.id, comp);

            //First enumerate trough the sequence of IGroupings.
            foreach(IGrouping<int, EmployeeOptionEntry> keyGroup in opts)
            {
                Console.WriteLine("Option records for: " + (comp.isFounder(keyGroup.Key) ? "founder" :"nonfounder"));

                //now enumerate trough the grouping's sequence of EmployeeOptionEntry elements.
                foreach(EmployeeOptionEntry element in keyGroup)
                {
                    Console.WriteLine("id={0} : optionsCount= {1} : dateAwarded={2:d}",
                                      element.id, element.optionsCount, element.dateAwarded);
                }
            }
        }