Collections Data Structure C#

#region License
// Copyright 2006 James Newton-King
// http://www.newtonsoft.com
//
// This work is licensed under the Creative Commons Attribution 2.5 License
// http://creativecommons.org/licenses/by/2.5/
//
// You are free:
//    * to copy, distribute, display, and perform the work
//    * to make derivative works
//    * to make commercial use of the work
//
// Under the following conditions:
//    * You must attribute the work in the manner specified by the author or licensor:
//          - If you find this component useful a link to http://www.newtonsoft.com would be appreciated.
//    * For any reuse or distribution, you must make clear to others the license terms of this work.
//    * Any of these conditions can be waived if you get permission from the copyright holder.
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace MySpace.Common.IO.JSON.Utilities
{
    internal delegate T Func(A0 arg0);
    internal static class CollectionUtils
    {
        /// 
        /// Group the collection using a function which returns the key.
        /// 

        /// The source collection to group.
        /// The key selector.
        /// A Dictionary with each key relating to a list of objects in a list grouped under it.
        public static Dictionary> GroupBy(ICollection source, Func keySelector)
        {
            if (keySelector == null)
                throw new ArgumentNullException("grouper");
            Dictionary> groupedValues = new Dictionary>();
            foreach (V value in source)
            {
                // using delegate to get the value's key
                K key = keySelector(value);
                List groupedValueList;
                // add a list for grouped values if the key is not already in Dictionary
                if (!groupedValues.TryGetValue(key, out groupedValueList))
                {
                    groupedValueList = new List();
                    groupedValues.Add(key, groupedValueList);
                }
                groupedValueList.Add(value);
            }
            return groupedValues;
        }
    }
}