Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Group the collection using a function which returns the key

#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, T>(A0 arg0);     internal static class CollectionUtils     {         /// <summary>         /// Group the collection using a function which returns the key.         /// </summary>         /// <param name="source">The source collection to group.</param>         /// <param name="keySelector">The key selector.</param>         /// <returns>A Dictionary with each key relating to a list of objects in a list grouped under it.</returns>         public static Dictionary<K, List<V>> GroupBy<K, V>(ICollection<V> source, Func<V, K> keySelector)         {             if (keySelector == null)                 throw new ArgumentNullException("grouper");             Dictionary<K, List<V>> groupedValues = new Dictionary<K, List<V>>();             foreach (V value in source)             {                 // using delegate to get the value's key                 K key = keySelector(value);                 List<V> groupedValueList;                 // add a list for grouped values if the key is not already in Dictionary                 if (!groupedValues.TryGetValue(key, out groupedValueList))                 {                     groupedValueList = new List<V>();                     groupedValues.Add(key, groupedValueList);                 }                 groupedValueList.Add(value);             }             return groupedValues;         }     } }