跳至页脚内容
.NET 帮助

C# Groupby(开发人员如何使用)

在 C# 中,GroupBy 方法 是一个强大的工具,可以根据指定的键将数据源中的元素组织成组。 此方法是 LINQ(语言集成查询)的一部分,可以用来按单一属性或多个属性对项目进行分组,使其在数据分析和处理方面非常有价值。 GroupBy 方法简化了复杂的数据操作,允许根据特定标准高效地组织和检索数据。 我们将在本博客中讨论 GroupBy 和 IronPDF 库

GroupBy 的基本知识

GroupBy 方法的本质在于它能够根据指定的键将集合的元素分类成组。 此键属性决定了项目如何分组。 例如,您可以通过学生的年龄键值对学生列表进行分组,创建相同年龄学生的群组。 每个组由一个键值和共享该键的项目集合表示。 键属性可以是任何对象,例如字符串、数字,甚至是匿名对象,这在进行数据分组时提供了灵活性。

使用方法语法与 GroupBy

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

要学习如何开始使用 IronPDF,请访问 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()
    {
        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}");
            }
        }
    }
}
$vbLabelText   $csharpLabel

C# GroupBy (对开发人员的工作原理): 图 1 - 上一个代码示例的控制台输出

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}");
            }
        }
    }
}
$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}");
            }
        }
    }
}
$vbLabelText   $csharpLabel

在此示例中,通过使用匿名类型作为键,学生被按姓名和年龄分组。 这导致每个名称和年龄的唯一组合作为一个单独的组出现,展示了 GroupBy 用于复杂分组场景的灵活性。

额外的 GroupBy 信息

高级 GroupBy 使用

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

GroupBy 的延迟执行

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

将 IronPDF 引入 C# 项目

C# GroupBy (对开发人员的工作原理): 图 2 - IronPDF 网页

IronPDF 是一个用于 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();

        // 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");
    }
}
$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}");
    }
}
$vbLabelText   $csharpLabel

在此示例中,我们首先使用 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 为那些希望在购买前探索其功能的人提供免费试用版。 对于那些准备将其集成到项目中的人,许可费起始于$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。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。