.NET 帮助

C# Groupby(开发者如何使用)

发布 2024年四月3日
分享:

在 C# 中GroupBy 方法是一种功能强大的工具,可根据指定的关键字将数据源中的元素组织成组。 本方法是 LINQ(语言综合查询)该工具可用于通过单个属性或多个属性对项目进行分组,因此在数据分析和操作方面非常有价值。 GroupBy 方法简化了复杂的数据操作,允许根据特定条件高效地组织和检索数据。 我们将讨论 GroupBy 和IronPDF 库在本博客中。

GroupBy 的基础知识

GroupBy 方法的精髓在于它能够根据指定的键将给定集合中的元素归类到组中。 该关键属性决定了项目的分组方式。 例如,您可以按照年龄键值对学生列表进行分组,创建具有相同年龄的学生群组。 每个组由一个键值和共享该键值的项目集合表示。 关键属性可以是任何对象,如字符串、数字,甚至是匿名对象,从而为数据分组提供灵活性。

使用方法语法中的 GroupBy

在 C# 中,有两种方法可以应用 GroupBy 方法:方法语法和查询语法。 方法语法使用 lambda 表达式定义分组键,是应用 GroupBy 操作的直接方法。

请看下面的示例,使用方法语法将学生列表按年龄分组:

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(如何为开发人员工作):图 1 - 上一代码示例的控制台输出

LINQ GroupBy 方法使用 lambda 表达式按年龄键值对学生进行分组。 group.Key 表示年龄组,内部 foreach 循环遍历组内的每个学生,打印他们的姓名。

利用查询语法中的 GroupBy

查询语法为执行分组操作提供了一种更具表现力的方式,类似于 SQL 查询。 在处理复杂的数据转换和多个分组标准时,它尤其有用。 下面是使用查询语法实现与上例类似功能的方法:

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#

在这个片段中,查询语法按 年龄对学生进行分组,与方法语法类似,但语法不同,有些人认为这样更易读。

按多个键和属性分组

GroupBy 方法更高级的用法是通过多个键或属性对数据进行分组。 这种技术可以根据多个值进行更详细的数据分析和分类。 通过使用匿名对象或元组,您可以根据属性组合对项目进行分组,从而为您的应用程序提供更丰富的数据结构。

示例:按姓名和年龄对学生进行分组

考虑这样一种情况:您不仅需要按年龄键值分组,还需要按姓名分组,以便在列表中识别具有相同姓名和年龄键值的学生。这可以通过同时包含姓名和年龄的匿名类型进行分组来实现。

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#

在此示例中,使用匿名类型作为关键字,按姓名和年龄对学生进行分组。 结果,每一个姓名和年龄的独特组合都被表示为一个单独的组,展示了 GroupBy 在复杂分组情况下的灵活性。

额外的分组信息

高级 GroupBy 使用

当您需要按多个键值分组,或想对分组数据执行其他操作(如计数、筛选或排序)时,GroupBy 就会变得更加强大。 您可以通过将 GroupBy 与其他 LINQ 方法相结合或使用匿名类型对多个属性进行分组来实现这一目标。

GroupBy 中的延迟执行

需要注意的是,GroupBy 使用延迟执行,在按给定键迭代时处理项目。 这意味着调用 GroupBy 方法时不会立即执行分组操作。 例如,在foreach 循环中,执行被推迟,直到对分组数据进行遍历。这种行为非常高效,因为它允许在最终处理数据之前进一步优化和修改查询。

向 C# 项目介绍 IronPdf

C# GroupBy(如何为开发人员工作):图 2 - IronPDF 网页

IronPDFC# PDF 是一个全面的 C# 库,使开发人员能够在 .NET 应用程序中创建、操作和转换 PDF 文档。 这款功能强大的工具提供了广泛的功能,包括从 HTML 生成 PDF翻译的内容还包括编辑现有的 PDF 文件等。 IronPdf 简化了将 PDF 功能集成到应用程序中的过程,使其成为任何需要操作 PDF 的项目的宝贵资产。

IronPDF 的主要特点是其HTML 转换为 PDF, 确保布局和样式得以保留。 它可以从网页内容生成 PDF,非常适合报告、发票和文档。 HTML文件、URL和HTML字符串可以无缝转换为PDF。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
VB   C#

从分组数据生成 PDF 报告

让我们扩展一下之前按年龄关键值对学生进行分组的例子。 将学生分组后,我们将使用 IronPDF 生成 PDF 报告,列出这些分组以及每组中学生的姓名。

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#

在本例中,我们首先使用GroupBy方法将学生按年龄分组。 然后,我们构建一个 HTML 字符串(该方法会返回该字符串),将分组数据格式化为一份报告,其中包含每个年龄组的标题和每个组下的学生姓名列表。然后使用 IronPDF 的 ChromePdfRenderer 类将 HTML 字符串转换为 PDF 文档。 生成的 PDF 文件将保存到一个文件中,提供一份格式整洁的按年龄分组的学生报告。

输出

以下是 IronPDF 生成的输出 PDF:

C# GroupBy(如何为开发人员工作):图 3 - 上一代码示例中输出的 PDF

结论

C# GroupBy(如何为开发人员工作):图 4 - IronPDF 许可计划

C# 中的 GroupBy 方法是一种基于指定键对数据进行分组的通用而强大的工具。 无论您是喜欢使用 lambda 表达式的方法语法,还是更喜欢声明式查询语法,GroupBy 都能让您以易于管理和阅读的方式组织复杂的数据结构。 通过掌握 GroupBy 和其他 LINQ 方法,您可以大大提高在 C# 应用程序中操作和分析数据的能力。

IronPDF 提供了一个免费试用对于那些希望在购买前了解其功能的人来说,翻译必须是专业的。 对于那些准备将其集成到自己项目中的人来说,许可证起价为 $749,使其成为在 C# 应用程序中进行专业级 PDF 操作和生成的一项值得投资的项目。

< 前一页
C# 中的 IndexOf(开发人员如何使用)
下一步 >
C# Imap(针对开发者的工作原理)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >