Sintaxis LINQ: Group
En muchas ocasiones cuando se lanzan queries contra fuentes de datos es necesario que los resultados sean devueltos según un criterio determinada. Para realizar esta operación en LINQ se utiliza GroupBy, que cuenta con un alias Group. Las signaturas de este método son:
1: public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
2: this IEnumerable<TSource> source,
3: Func<TSource, TKey> keySelector)
4:
5: public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
6: this IEnumerable<TSource> source,
7: Func<TSource, TKey> keySelector,
8: IEqualityComparer<TKey> comparer)
9:
10: public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
11: this IEnumerable<TSource> source,
12: Func<TSource, TKey> keySelector,
13: Func<TSource, TElement> elementSelector)
14:
15: public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
16: this IEnumerable<TSource> source,
17: Func<TSource, TKey> keySelector,
18: Func<TSource, TElement> elementSelector,
19: IEqualityComparer<TKey> comparer)
Cómo se puede ver en los métodos todas las sobrecargas del método GroupBy devuelven una colección de IGrouping<TKey, TElement>, lo que facilita mucho el trabajo a la hora de recorrer los datos. Otro detalle importante es que tiene una sobrecarga que permite personalidad el modo en el que los datos serán comparados para su agrupación. Veamos un ejemplo y la sintaxis que se usa:
1: var list = from d in developers
2: group d by d.Language into p
3: select new { Language = p.Key, Developers = p }; 4:
5: foreach (var languages in list)
6: { 7: Console.WriteLine(languages.Language);
8: foreach (var developer in languages.Developers)
9: { 10: Console.WriteLine(developer.Name);
11: }
12: }
13:
14: var list = developers.GroupBy(d => d.Language, d => d.Name);
15:
16: foreach (var languages in list)
17: { 18: Console.WriteLine(languages.Key);
19: foreach (var developer in languages)
20: { 21: Console.WriteLine(developer);
22: }
23: }
Nota: Para la realización de estos ejemplos se han utilizado una serie entidades y colecciones que podréis encontrar aquí.