Está en la página 1de 8

CAPÍTULO 5

Agrupando datos
LINQ permite agrupar los elementos de una secuencia mediante la cláusula
group, en la sintaxis de consulta, y el método GroupBy(), en la sintaxis basada en
métodos.

5.1 Agrupar datos


Tanto la cláusula group como el método GroupBy() permiten agrupar los elementos
de una secuencia por una clave especificada. Como resultado, devuelven una
secuencia de tipo IEnumerable<IGrouping<K,E>> que tiene la forma de una lista de
listas. Cada objeto IGrouping<K,E> representa a un grupo, el cual está formado por
una propiedad llamada Key, que representa la clave del grupo, y una lista de cero o
más elementos agrupados bajo esa clave.
Una clave de grupo puede ser de cualquier tipo, por ejemplo, una cadena de
caracteres, un tipo numérico integrado, un tipo con nombre definido por el usuario o
un tipo anónimo. El compilador infiere el tipo de la clave.
Uno de los usos más comunes de la cláusula group es agrupar una secuencia
de objetos por una propiedad. En el siguiente ejemplo se agrupa una secuencia de
objetos de tipo Student por la propiedad LastName. En este caso, las claves de los
grupos serán los distintos apellidos de los estudiantes y se almacenarán en la
propiedad Key de cada objeto IGrouping<K,E>.

En tiempo de compilación, las cláusulas group se traducen en llamadas al método


GroupBy().

1
5.2 by
La palabra clave contextual by se utiliza junto con la cláusula group para especificar
cómo deberían estar agrupados los elementos devueltos.
En el siguiente ejemplo se muestra el uso de la palabra clave contextual by junto con
la cláusula group para especificar que los estudiantes deben agruparse por la primera
letra del apellido de cada estudiante.

5.3 Enumerar los resultados de una cláusula group


Dado que los objetos IGrouping<K,E> generados por una cláusula group son
esencialmente una lista de listas, debe utilizar un bucle foreach anidado para acceder
a los elementos de cada grupo. El bucle externo itera sobre los grupos, y el bucle
interno itera sobre los elementos de cada grupo. Pueden existir grupos que tengan
una clave pero que no tengan ningún elemento.
En el siguiente ejemplo, se itera sobre la consulta generada en la sección 3.2.

5.4 into
La palabra clave contextual into permite crear un identificador temporal que
almacene los grupos generados por una cláusula group para luego poder realizar
operaciones de consulta adicionales sobre cada grupo.
En el siguiente ejemplo se muestra el uso de la palabra clave into para crear un
identificador temporal llamado fruitGroup, el cual permite invocar al método

2
Count() sobre cada grupo para seleccionar solo aquellos que contienen dos o más
palabras.

5.5 Agrupar una secuencia por más de un valor


Puede agrupar una secuencia por más de un valor utilizando un tipo anónimo que
actúe como clave de cada grupo y encapsule dichos valores.
En el siguiente ejemplo, la consulta genera un grupo por cada conjunto de
estudiantes con la misma primera letra del apellido y que hayan obtenido una nota
superior a 85 en el primer examen.

3
Tal como se puede ver en el ejemplo, puede ordenar los grupos por cualquier
propiedad de la clave.

5.6 Crear un grupo anidado


En el siguiente ejemplo se muestra cómo crear grupos anidados en una expresión de
consulta. Cada grupo creado a partir del año o nivel académico de los estudiantes se
subdivide en grupos en función de sus nombres.

4
Observe que, en este caso, se necesitan tres bucles foreach anidados para iterar sobre
los elementos internos de un grupo anidado.
5.7 Realizar una subconsulta sobre una operación de
agrupación
En el siguiente ejemplo se muestra cómo crear una consulta que ordene los datos de
origen en grupos y, luego, realice una subconsulta sobre cada grupo
individualmente. La técnica consiste en agrupar los elementos de origen utilizando
una continuación llamada newGroup y luego generar una nueva subconsulta contra
newGroup. Esta subconsulta se ejecuta contra cada nuevo grupo creado por la
consulta externa. Tenga en cuenta que en este ejemplo en particular el resultado final
no es un grupo, sino una secuencia plana de tipos anónimos.

5.8 Agrupar elementos en base a una expresión booleana


A continuación, se muestran dos ejemplos de cómo agrupar elementos utilizando
una expresión booleana. En ambos, la cláusula group genera dos grupos: uno en
donde el valor de la propiedad Key es true, y otro en donde el valor es false.

5
Ejemplo 1
En este ejemplo, la expresión booleana evalúa si el puntaje promedio de los
exámenes de un estudiante es mayor a 75. Los resultados se proyectan en un tipo
anónimo porque no es necesario conservar el elemento completo. Tenga en cuenta
que las propiedades del tipo anónimo se convierten en propiedades del miembro Key
y pueden ser accedidas por nombre cuando la consulta es ejecutada.

Ejemplo 2
En el siguiente ejemplo, se utiliza la cláusula group para agrupar los enteros de una
lista según sean pares o impares.

5.9 Agrupar elementos en base a un rango numérico


6
En el siguiente ejemplo se muestra cómo agrupar elementos utilizando una
expresión para crear claves de grupo numéricas que representan un rango de
percentil. La consulta proyecta los resultados en un tipo anónimo que contiene solo
el nombre, el apellido y el rango de percentil al que pertenece el estudiante. Esto es
porque no es necesario utilizar el objeto Student completo para mostrar los
resultados. GetPercentile es un método auxiliar que calcula un percentil en función
del puntaje promedio del estudiante. El método devuelve un entero entre 0 y 10.

7
Agrupar por una clave compuesta
En el siguiente ejemplo se muestra cómo utilizar un tipo anónimo para encapsular
una clave que contiene múltiples valores.

#### Ejemplo 2 ####


Utilice una clave compuesta cuando desee agrupar elementos por más de una clave.
Puede crear una clave compuesta utilizando un tipo anónimo o un tipo con nombre
para contener el elemento clave. La cláusula group hace que se cree un grupo
separado para cada conjunto de personas con el mismo apellido y la misma ciudad.

Utilice un tipo con nombre si debe pasar la variable de consulta a otro método.

Ejemplo 1:
El resultado de la consulta es un tipo IGrouping<K,E> que contiene una propiedad
pública Key de tipo char y una colección IEnumerable<T> que contiene cada
elemento de la agrupación.
El resultado de una cláusula group es una secuencia de secuencias. Por lo tanto, para
acceder a los elementos individuales de cada grupo devuelto, utilice un bucle
foreach anidado dentro del bucle que itera las claves de grupo, tal como se muestra
en el siguiente ejemplo.

También podría gustarte