AYUDA .NET

C# Groupby (Cómo funciona para desarrolladores)

Actualizado 3 de abril, 2024
Compartir:

En C#, la función Método GroupBy es una potente herramienta que organiza los elementos de una fuente de datos en grupos basados en una clave especificada. Este método forma parte de LINQ (Idioma Consulta integrada) y puede utilizarse para agrupar elementos por una sola propiedad o por varias, lo que lo convierte en una herramienta inestimable para el análisis y la manipulación de datos. El método GroupBy simplifica las operaciones de datos complejas, permitiendo una organización y recuperación de datos eficiente basada en criterios específicos. Hablaremos de Groupby y IronPDF biblioteca en este blog.

Conceptos básicos de GroupBy

La esencia del método GroupBy reside en su capacidad para clasificar los elementos de una colección dada en grupos según una clave especificada. Esta propiedad clave determina cómo se agrupan los elementos. Por ejemplo, puede agrupar una lista de alumnos por su valor clave de edad, creando grupos de alumnos con la misma edad. Cada grupo está representado por un valor clave y una colección de elementos que comparten esa clave. La propiedad clave puede ser cualquier objeto, como una cadena, un número o incluso un objeto anónimo, lo que proporciona flexibilidad a la hora de agrupar los datos.

Uso de GroupBy con la sintaxis de métodos

En C#, hay dos formas de aplicar el método GroupBy: sintaxis de método y sintaxis de consulta. La sintaxis de método utiliza expresiones lambda para definir la clave de agrupación y es un enfoque directo para aplicar la operación GroupBy.

Considere el siguiente ejemplo en el que se utiliza la sintaxis de métodos para agrupar una lista de alumnos por su edad:

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Student> studentList = new List<Student>
        {
            new Student { Name = "Alice", Age = 20 },
            new Student { Name = "Bob", Age = 20 },
            new Student { Name = "Charlie", Age = 21 }
        };
        var groupedResult = studentList.GroupBy(student => student.Age);
        foreach (var group in groupedResult)
        {
            Console.WriteLine($"Age Group: {group.Key}");
            foreach (var student in group)
            {
                Console.WriteLine($"Student Name: {student.Name}");
            }
        }
    }
}
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Student> studentList = new List<Student>
        {
            new Student { Name = "Alice", Age = 20 },
            new Student { Name = "Bob", Age = 20 },
            new Student { Name = "Charlie", Age = 21 }
        };
        var groupedResult = studentList.GroupBy(student => student.Age);
        foreach (var group in groupedResult)
        {
            Console.WriteLine($"Age Group: {group.Key}");
            foreach (var student in group)
            {
                Console.WriteLine($"Student Name: {student.Name}");
            }
        }
    }
}
Public Class Student
	Public Property Name() As String
	Public Property Age() As Integer
End Class
Public Class Program
	Public Shared Sub Main()
		Dim studentList As New List(Of Student) From {
			New Student With {
				.Name = "Alice",
				.Age = 20
			},
			New Student With {
				.Name = "Bob",
				.Age = 20
			},
			New Student With {
				.Name = "Charlie",
				.Age = 21
			}
		}
		Dim groupedResult = studentList.GroupBy(Function(student) student.Age)
		For Each group In groupedResult
			Console.WriteLine($"Age Group: {group.Key}")
			For Each student In group
				Console.WriteLine($"Student Name: {student.Name}")
			Next student
		Next group
	End Sub
End Class
VB   C#

C# Groupby (Cómo funciona para desarrolladores): Figura 1 - Salida de la consola del ejemplo de código anterior

El método LINQ GroupBy utiliza una expresión lambda para agrupar a los alumnos por su valor clave Edad. grupo.Clave representa el grupo de edad, y el bucle foreach interno itera sobre cada estudiante dentro de un grupo, imprimiendo sus nombres.

Utilización de GroupBy con la sintaxis de consulta

La sintaxis de consulta ofrece una forma más expresiva de realizar operaciones de agrupación, parecida a las consultas SQL. Es especialmente útil cuando se trata de transformaciones de datos complejas y criterios de agrupación múltiples. A continuación se muestra cómo puede conseguir una funcionalidad similar a la del ejemplo anterior utilizando la sintaxis de consulta:

public static void Main()
{
    List<Student> studentList = new List<Student>
    {
        new Student { Name = "Alice", Age = 20 },
        new Student { Name = "Bob", Age = 20 },
        new Student { Name = "Charlie", Age = 21 }
    };
    var groupedResult = from student in studentList
                        group student by student.Age into ageGroup
                        select new { Age = ageGroup.Key, Students = ageGroup };
    foreach (var group in groupedResult)
    {
        Console.WriteLine($"Age Group: {group.Age}");
        foreach (var student in group.Students)
        {
            Console.WriteLine($"Student Name: {student.Name}");
        }
    }
}
public static void Main()
{
    List<Student> studentList = new List<Student>
    {
        new Student { Name = "Alice", Age = 20 },
        new Student { Name = "Bob", Age = 20 },
        new Student { Name = "Charlie", Age = 21 }
    };
    var groupedResult = from student in studentList
                        group student by student.Age into ageGroup
                        select new { Age = ageGroup.Key, Students = ageGroup };
    foreach (var group in groupedResult)
    {
        Console.WriteLine($"Age Group: {group.Age}");
        foreach (var student in group.Students)
        {
            Console.WriteLine($"Student Name: {student.Name}");
        }
    }
}
Public Shared Sub Main()
	Dim studentList As New List(Of Student) From {
		New Student With {
			.Name = "Alice",
			.Age = 20
		},
		New Student With {
			.Name = "Bob",
			.Age = 20
		},
		New Student With {
			.Name = "Charlie",
			.Age = 21
		}
	}
	Dim groupedResult = From student In studentList
		Group student By student.Age Into ageGroup = Group
		Select New With {
			Key .Age = Age,
			Key .Students = ageGroup
		}
	For Each group In groupedResult
		Console.WriteLine($"Age Group: {group.Age}")
		For Each student In group.Students
			Console.WriteLine($"Student Name: {student.Name}")
		Next student
	Next group
End Sub
VB   C#

En este fragmento, la sintaxis de la consulta agrupa a los alumnos por Edad, de forma similar a la sintaxis del método pero con una sintaxis diferente que algunos encuentran más legible.

Agrupación por varias claves y propiedades

Un uso más avanzado del método GroupBy implica agrupar datos por múltiples claves o propiedades. Esta técnica permite un análisis más detallado de los datos y una categorización basada en múltiples valores. Al utilizar objetos anónimos o tuplas, puedes agrupar elementos basándote en una combinación de propiedades, lo que proporciona una estructura de datos más rica para tus aplicaciones.

Ejemplo: Agrupación de alumnos por nombre y edad

Piense en una situación en la que necesite agrupar a los alumnos no sólo por su valor clave de edad, sino también por su nombre, para identificar a los alumnos con los mismos valores clave de nombre y edad en una lista. Esto se puede conseguir agrupando por un tipo anónimo que contenga tanto el nombre como la edad.

public static void Main()
{
    List<Student> studentList = new List<Student>
    {
        new Student { Name = "Alice", Age = 20 },
        new Student { Name = "Alice", Age = 21 },
        new Student { Name = "Bob", Age = 20 },
        new Student { Name = "Charlie", Age = 21 }
    };
    var groupedResult = studentList.GroupBy(student => new { student.Name, student.Age });
    foreach (var group in groupedResult)
    {
        Console.WriteLine($"Group Key: Name = {group.Key.Name}, Age = {group.Key.Age}");
        foreach (var student in group)
        {
            Console.WriteLine($"Student Name: {student.Name}, Age: {student.Age}");
        }
    }
}
public static void Main()
{
    List<Student> studentList = new List<Student>
    {
        new Student { Name = "Alice", Age = 20 },
        new Student { Name = "Alice", Age = 21 },
        new Student { Name = "Bob", Age = 20 },
        new Student { Name = "Charlie", Age = 21 }
    };
    var groupedResult = studentList.GroupBy(student => new { student.Name, student.Age });
    foreach (var group in groupedResult)
    {
        Console.WriteLine($"Group Key: Name = {group.Key.Name}, Age = {group.Key.Age}");
        foreach (var student in group)
        {
            Console.WriteLine($"Student Name: {student.Name}, Age: {student.Age}");
        }
    }
}
Public Shared Sub Main()
	Dim studentList As New List(Of Student) From {
		New Student With {
			.Name = "Alice",
			.Age = 20
		},
		New Student With {
			.Name = "Alice",
			.Age = 21
		},
		New Student With {
			.Name = "Bob",
			.Age = 20
		},
		New Student With {
			.Name = "Charlie",
			.Age = 21
		}
	}
	Dim groupedResult = studentList.GroupBy(Function(student) New With {
		Key student.Name,
		Key student.Age
	})
	For Each group In groupedResult
		Console.WriteLine($"Group Key: Name = {group.Key.Name}, Age = {group.Key.Age}")
		For Each student In group
			Console.WriteLine($"Student Name: {student.Name}, Age: {student.Age}")
		Next student
	Next group
End Sub
VB   C#

En este ejemplo, los alumnos se agrupan por nombre y edad utilizando un tipo anónimo como clave. Esto da como resultado grupos en los que cada combinación única de nombre y edad se representa como un grupo independiente, lo que demuestra la flexibilidad de GroupBy para escenarios de agrupación complejos.

Información GroupBy adicional

Uso avanzado de GroupBy

GroupBy se vuelve aún más potente cuando necesita agrupar por múltiples valores clave o cuando desea realizar operaciones adicionales en los datos agrupados, como contar, filtrar u ordenar. Puede conseguirlo combinando GroupBy con otros métodos LINQ o utilizando tipos anónimos para agrupar por múltiples propiedades.

Ejecución diferida en GroupBy

Es importante tener en cuenta que GroupBy utiliza la ejecución diferida, procesando los elementos cuando se itera sobre ellos por una clave determinada. Esto significa que la operación de agrupación no se ejecuta inmediatamente cuando se llama al método GroupBy. En su lugar, la ejecución se aplaza hasta que se itera sobre los datos agrupados, como en un bucle foreach. Este comportamiento es eficaz porque permite realizar más optimizaciones y modificaciones de la consulta antes de procesar finalmente los datos.

Presentación de IronPDF a C# Proyectos

C# Groupby (Cómo funciona para los desarrolladores): Figura 2 - Página web de IronPDF

IronPDF es una completa biblioteca para C# que permite a los desarrolladores crear, manipular y convertir documentos PDF dentro de aplicaciones .NET. Esta potente herramienta ofrece una amplia gama de funcionalidades, desde **Generación de PDF a partir de HTML a la edición de archivos PDF existentes y mucho más. IronPDF simplifica la integración de funciones PDF en sus aplicaciones, lo que lo convierte en un valioso activo para cualquier proyecto que requiera la manipulación de PDF.

Generación de informes PDF a partir de datos agrupados

Ampliemos nuestros ejemplos anteriores de agrupación de alumnos por valor clave de edad. Después de agrupar a los alumnos, utilizaremos IronPDF para generar un informe PDF que enumere estos grupos junto con los nombres de los alumnos de cada grupo.

using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public class Program
{
    public static void Main()
    {
        IronPdf.License.LicenseKey = "License";
        List<Student> studentList = new List<Student>
        {
            new Student { Name = "Alice", Age = 20 },
            new Student { Name = "Bob", Age = 20 },
            new Student { Name = "Charlie", Age = 21 },
            new Student { Name = "David", Age = 21 }
        };
        var groupedResult = studentList.GroupBy(student => student.Age);
        var htmlContent = "<h1>Student Report</h1>";
        foreach (var group in groupedResult)
        {
            htmlContent += $"<h2>Age Group: {group.Key}</h2><ul>";
            foreach (var student in group)
            {
                htmlContent += $"<li>{student.Name}</li>";
            }
            htmlContent += "</ul>";
        }
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        var outputPath = "StudentReport.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"PDF report generated at {outputPath}");
    }
}
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public class Program
{
    public static void Main()
    {
        IronPdf.License.LicenseKey = "License";
        List<Student> studentList = new List<Student>
        {
            new Student { Name = "Alice", Age = 20 },
            new Student { Name = "Bob", Age = 20 },
            new Student { Name = "Charlie", Age = 21 },
            new Student { Name = "David", Age = 21 }
        };
        var groupedResult = studentList.GroupBy(student => student.Age);
        var htmlContent = "<h1>Student Report</h1>";
        foreach (var group in groupedResult)
        {
            htmlContent += $"<h2>Age Group: {group.Key}</h2><ul>";
            foreach (var student in group)
            {
                htmlContent += $"<li>{student.Name}</li>";
            }
            htmlContent += "</ul>";
        }
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        var outputPath = "StudentReport.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"PDF report generated at {outputPath}");
    }
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Linq
Public Class Student
	Public Property Name() As String
	Public Property Age() As Integer
End Class
Public Class Program
	Public Shared Sub Main()
		IronPdf.License.LicenseKey = "License"
		Dim studentList As New List(Of Student) From {
			New Student With {
				.Name = "Alice",
				.Age = 20
			},
			New Student With {
				.Name = "Bob",
				.Age = 20
			},
			New Student With {
				.Name = "Charlie",
				.Age = 21
			},
			New Student With {
				.Name = "David",
				.Age = 21
			}
		}
		Dim groupedResult = studentList.GroupBy(Function(student) student.Age)
		Dim htmlContent = "<h1>Student Report</h1>"
		For Each group In groupedResult
			htmlContent &= $"<h2>Age Group: {group.Key}</h2><ul>"
			For Each student In group
				htmlContent &= $"<li>{student.Name}</li>"
			Next student
			htmlContent &= "</ul>"
		Next group
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		Dim outputPath = "StudentReport.pdf"
		pdf.SaveAs(outputPath)
		Console.WriteLine($"PDF report generated at {outputPath}")
	End Sub
End Class
VB   C#

En este ejemplo, primero agrupamos a los alumnos por edad utilizando el método GroupBy. A continuación, construimos una cadena HTML, que el método devuelve, que formatea estos datos agrupados en un informe, con encabezados para cada grupo de edad y listas de nombres de alumnos bajo cada grupo. A continuación, se utiliza la clase ChromePdfRenderer de IronPDF para convertir esta cadena HTML en un documento PDF. El PDF resultante se guarda en un archivo, proporcionando un informe con un formato ordenado de los alumnos agrupados por edades.

Salida

Aquí está el PDF de salida generado por el IronPDF:

C# Groupby (Cómo funciona para desarrolladores): Figura 3 - PDF resultante del ejemplo de código anterior

Conclusión

C# Groupby (Cómo funciona para los desarrolladores): Figura 4 - Plan de licencias de IronPDF

El método GroupBy en C# es una herramienta versátil y potente para agrupar datos basándose en claves especificadas. Tanto si prefiere la sintaxis de método con expresiones lambda como la sintaxis de consulta más declarativa, GroupBy le permite organizar estructuras de datos complejas de forma manejable y legible. Si domina GroupBy y otros métodos LINQ, podrá mejorar significativamente su capacidad para manipular y analizar datos en sus aplicaciones C#.

IronPDF proporciona un **Prueba gratuita para quienes deseen explorar sus características antes de comprometerse a comprarlo. Para quienes estén preparados para integrarlo en sus proyectos, el precio de la licencia comienza en $749, lo que lo convierte en una inversión rentable para la manipulación y generación de PDF de nivel profesional en aplicaciones C#.

< ANTERIOR
IndexOf C# (Cómo funciona para los desarrolladores)
SIGUIENTE >
C# Imap (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.7 recién publicada

Descarga gratuita de NuGet Descargas totales: 9,974,197 Ver licencias >
123