.NET 帮助 C# Groupby(开发人员如何使用) Curtis Chau 已更新:六月 22, 2025 Download IronPDF NuGet 下载 DLL 下载 Windows 安装程序 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article 在 C# 中,GroupBy 方法 是一个强大的工具,可以根据指定的键将数据源中的元素组织成组。 此方法是 LINQ(语言集成查询)的一部分,可以用来按单一属性或多个属性对项目进行分组,使其在数据分析和处理方面非常有价值。 GroupBy 方法简化了复杂的数据操作,允许根据特定标准高效地组织和检索数据。 我们将在本博客中讨论 GroupBy 和 IronPDF 库。 GroupBy 的基本知识 GroupBy 方法的本质在于它能够根据指定的键将集合的元素分类成组。 此键属性决定了项目如何分组。 例如,您可以通过学生的年龄键值对学生列表进行分组,创建相同年龄学生的群组。 每个组由一个键值和共享该键的项目集合表示。 键属性可以是任何对象,例如字符串、数字,甚至是匿名对象,这在进行数据分组时提供了灵活性。 使用方法语法与 GroupBy 在 C# 中,有两种应用 GroupBy 方法的方法:方法语法和查询语法。 方法语法使用 lambda 表达式来定义分组键,是应用 GroupBy 操作的直接方法。 考虑以下使用方法语法按年龄分组学生列表的示例: 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() { List<Student> studentList = new List<Student> { new Student { Name = "Alice", Age = 20 }, new Student { Name = "Bob", Age = 20 }, new Student { Name = "Charlie", Age = 21 } }; // Group students by their age using GroupBy 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}"); } } } } 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() { List<Student> studentList = new List<Student> { new Student { Name = "Alice", Age = 20 }, new Student { Name = "Bob", Age = 20 }, new Student { Name = "Charlie", Age = 21 } }; // Group students by their age using GroupBy 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}"); } } } } 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() 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 } } ' Group students by their age using GroupBy 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 $vbLabelText $csharpLabel LINQ 的 GroupBy 方法使用 lambda 表达式按学生的 年龄 键值对学生进行分组。 group.Key 表示年龄组,内部的 foreach 循环遍历组内的每个学生,打印他们的名字。 利用查询语法与 GroupBy 查询语法提供了一种更具表现力的分组操作方式,类似于 SQL 查询。 当处理复杂的数据转换和多重分组条件时,它尤其有用。 以下是如何使用查询语法实现与前一个示例类似的功能: using System; using System.Collections.Generic; using System.Linq; public static 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 } }; // Group students by their age using query syntax 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}"); } } } } using System; using System.Collections.Generic; using System.Linq; public static 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 } }; // Group students by their age using query syntax 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}"); } } } } Imports System Imports System.Collections.Generic Imports System.Linq Public Module Program Public 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 } } ' Group students by their age using query syntax 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 End Module $vbLabelText $csharpLabel 在此片段中,查询语法按 年龄 对学生进行分组,类似于方法语法,但具有不同的语法,一些人认为这种语法更具可读性。 按多个键和属性进行分组 更高级别的 GroupBy 方法使用涉及按多个键或属性分组数据。 这种技术允许根据多个值进行更详细的数据分析和分类。 通过使用匿名对象或元组,您可以根据属性的组合对项目进行分组,从而为您的应用程序提供更丰富的数据结构。 示例:按姓名和年龄分组学生 考虑一种情况,您需要不仅按年龄键值对学生进行分组,还按姓名,以便在列表中识别具有相同名字和年龄键值的学生。这可以通过按包含姓名和年龄的匿名类型分组来实现。 using System; using System.Collections.Generic; using System.Linq; public static class Program { 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 } }; // Group students by both Name and Age using an anonymous type as the key 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}"); } } } } using System; using System.Collections.Generic; using System.Linq; public static class Program { 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 } }; // Group students by both Name and Age using an anonymous type as the key 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}"); } } } } Imports System Imports System.Collections.Generic Imports System.Linq Public Module Program Public 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 } } ' Group students by both Name and Age using an anonymous type as the key 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 End Module $vbLabelText $csharpLabel 在此示例中,通过使用匿名类型作为键,学生被按姓名和年龄分组。 这导致每个名称和年龄的唯一组合作为一个单独的组出现,展示了 GroupBy 用于复杂分组场景的灵活性。 额外的 GroupBy 信息 高级 GroupBy 使用 当您需要按多个键值进行分组或希望对分组数据执行附加操作(如计数、过滤或排序)时,GroupBy 变得更加强大。 您可以通过将 GroupBy 与其他 LINQ 方法结合使用或通过匿名类型按多个属性分组来实现这一点。 GroupBy 的延迟执行 需要注意的是,GroupBy 使用延迟执行,通过给定的键在迭代时处理项目。 这意味着分组操作在调用 GroupBy 方法时不会立即执行。 相反,执行被推迟,直到分组数据被迭代(例如在 foreach 循环中)。这种行为是有效的,因为它允许在最终处理数据之前执行进一步的查询优化和修改。 将 IronPDF 引入 C# 项目 IronPDF 是一个用于 C# 的综合库,使开发人员能够在 .NET 应用程序中创建、处理和转换 PDF 文档。 这个强大的工具提供了一系列功能,从从 HTML 生成 PDF 到编辑现有的 PDF 文件等等。 IronPDF 简化了将 PDF 功能集成到您的应用程序中,使其成为任何需要 PDF 操作的项目的重要资产。 IronPDF 的关键特性是其HTML 到 PDF 的转换,确保布局和样式得到保留。 它从网页内容生成 PDF,非常适合用于报告、发票和文档。 下面是一个简化示例,演示了如何在 CQRS 设置中使用 IronPDF 来生成 PDF 报告。 using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); // 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"); // 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"); // 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(); // 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"); // 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"); // 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() ' 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") ' 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") ' 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 $vbLabelText $csharpLabel 从分组数据生成 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() { // Initialize IronPDF license if applicable 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 } }; // Group students by their age var groupedResult = studentList.GroupBy(student => student.Age); // Create HTML content for the PDF report 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>"; } // Initialize IronPDF renderer and generate PDF var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); // Specify path to save the PDF file 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() { // Initialize IronPDF license if applicable 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 } }; // Group students by their age var groupedResult = studentList.GroupBy(student => student.Age); // Create HTML content for the PDF report 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>"; } // Initialize IronPDF renderer and generate PDF var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); // Specify path to save the PDF file 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() ' Initialize IronPDF license if applicable 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 } } ' Group students by their age Dim groupedResult = studentList.GroupBy(Function(student) student.Age) ' Create HTML content for the PDF report 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 ' Initialize IronPDF renderer and generate PDF Dim renderer = New ChromePdfRenderer() Dim pdf = renderer.RenderHtmlAsPdf(htmlContent) ' Specify path to save the PDF file Dim outputPath = "StudentReport.pdf" pdf.SaveAs(outputPath) Console.WriteLine($"PDF report generated at {outputPath}") End Sub End Class $vbLabelText $csharpLabel 在此示例中,我们首先使用 GroupBy 方法按年龄对学生进行分组。 然后,我们构建一个 HTML 字符串,该方法返回的为格式化成报告的分组数据,包含每个年龄组的标题和每组学生名单。然后利用 IronPDF 的 ChromePdfRenderer 类将这个 HTML 字符串转换成 PDF 文档。 生成的 PDF 保存到文件中,提供了一份学生按年龄分组的整齐格式化的报告。 输出 这是由 IronPDF 生成的输出 PDF: 结论 C# 的 GroupBy 方法是一种多功能且强大的工具,用于基于指定键对数据进行分组。 无论您是偏爱使用 lambda 表达式的方法语法还是更具声明性的查询语法,GroupBy 都能让您以可管理和可读的方式组织复杂的数据结构。 通过掌握 GroupBy 和其他 LINQ 方法,您可以显著增强在 C# 应用程序中操作和分析数据的能力。 IronPDF 为那些希望在购买前探索其功能的人提供免费试用版。 对于那些准备将其集成到项目中的人,许可费起始于$799,使其成为在 C# 应用程序中进行专业级 PDF 操作和生成的值得投资之选。 常见问题解答 C# 中的 GroupBy 方法是什么? 在 C# 中,GroupBy 方法是一种 LINQ 功能,它根据指定的键将数据源中的元素组织成组,从而简化数据分析和操作。 GroupBy 方法如何使用 C# 中的方法语法? 使用带有 lambda 表达式的方法语法,GroupBy 方法通过指定的键对元素进行分组。例如,您可以按年龄对学生列表进行分组,从而创建年龄相近的学生的集群。 您可以与 GroupBy 方法一起使用查询语法吗? 可以,查询语法可以与 GroupBy 方法一起使用,提供了一种更具 SQL 风格和表达能力的方式来执行分组操作,尤其是对于复杂的数据转换。 如何使用 GroupBy 方法按多个键对数据进行分组? 您可以通过使用匿名对象或元组按多个键对数据进行分组,从而基于属性组合进行更详细的数据分析。 在 GroupBy 的上下文中,什么是延迟执行? 延迟执行意味着 GroupBy 操作在调用时不会立即执行。它在遍历分组数据时处理,从而实现查询优化。 如何使用 C# 从分组数据生成 PDF 报告? 您可以使用 IronPDF 将 HTML 字符串(格式化分组数据为报告)转换为 PDF 文档。这使得从使用 GroupBy 分组的数据中轻松生成整齐格式的 PDF 报告成为可能。 C# 中的一些高级分组技术是什么? C# 中的高级分组技术涉及使用匿名对象或元组通过多个键或属性对数据进行分组,增强了执行复杂数据分析的能力。 IronPDF 如何在 .NET 应用程序中协助实现专业级别的 PDF 管理? IronPDF 为 C# 开发者提供了创建和操作 PDF 文档的工具,包括从 HTML 内容生成 PDF 报告。这有助于在 .NET 应用程序中高效地管理专业级别的 PDF。 如何在C#中将HTML转换为PDF? 你可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF。你还可以使用RenderHtmlFileAsPdf将HTML文件转换为PDF。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已更新九月 4, 2025 RandomNumberGenerator C# 使用 RandomNumberGenerator C# 类可以帮助将您的 PDF 生成和编辑项目提升到一个新的高度。 阅读更多 已更新九月 4, 2025 C# String Equals(开发者用法) 与强大的 PDF 库 IronPDF 结合使用,切换模式匹配允许您为文档处理构建更智能、更简洁的逻辑。 阅读更多 已更新八月 5, 2025 C# Switch 模式匹配(开发者用法) 与强大的 PDF 库 IronPDF 结合使用,切换模式匹配允许您为文档处理构建更智能、更简洁的逻辑。 阅读更多 IndexOf C#(开发人员如何使用)C# Imap(开发人员如何使用)
已更新九月 4, 2025 RandomNumberGenerator C# 使用 RandomNumberGenerator C# 类可以帮助将您的 PDF 生成和编辑项目提升到一个新的高度。 阅读更多