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; } } }