Grouping Operators
Grouping operations place data in groups based on a common attribute.
The query operator methods used to perform grouping operations follow: GroupBy and ToLookup.
The GroupBy method groups elements of a sequence based on a key selector function. Its syntax follows:
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector )
Review an example of its use below:
List<int> values = new List<int>() { 7, 14, 28, 35, 77, 34, 52, 16, 777, 115}; IEnumerable<IGrouping<int, int>> query = from value in values group value by value % 2; foreach (var group in query) { Console.WriteLine(group.Key == 0 ? "\nEven values:" : "\nOdd values:"); foreach (int i in group) Console.WriteLine(i); }
The ToLookup method creates a Lookup<TKey, TElement> from an IEnumberable<T> based on a key selector function. Its syntax follows:
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector )
This method allows for the grouping of items through a key. The key also serves the purpose of gaining access to the items efficiently rather than through iteration like GroupBy. Review an example below:
static void Main(string[] args) { List<string> surnames = new List<string>(); surnames.Add("Starr"); surnames.Add("Crabtree"); surnames.Add("Nevermind"); ILookup<char, string> surnamesByInitial = surnames.ToLookup((n) => n[0]); Console.WriteLine("T's: {0}", surnamesByInitial['T'].Count()); Console.WriteLine("S's: {0}", surnamesByInitial['S'].Count()); Console.WriteLine("P's: {0}", surnamesByInitial['P'].Count()); }