在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在 C# 中GroupBy 方法是一种功能强大的工具,可根据指定的关键字将数据源中的元素组织成组。 本方法是 LINQ(语言综合查询)该工具可用于通过单个属性或多个属性对项目进行分组,因此在数据分析和操作方面非常有价值。 GroupBy 方法简化了复杂的数据操作,允许根据特定条件高效地组织和检索数据。 我们将讨论 GroupBy 和IronPDF 库在本博客中。
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
LINQ GroupBy 方法使用 lambda 表达式按年龄键值对学生进行分组。 group.Key 表示年龄组,内部 foreach 循环遍历组内的每个学生,打印他们的姓名。
查询语法为执行分组操作提供了一种更具表现力的方式,类似于 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
在这个片段中,查询语法按 年龄对学生进行分组,与方法语法类似,但语法不同,有些人认为这样更易读。
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
在此示例中,使用匿名类型作为关键字,按姓名和年龄对学生进行分组。 结果,每一个姓名和年龄的独特组合都被表示为一个单独的组,展示了 GroupBy 在复杂分组情况下的灵活性。
当您需要按多个键值分组,或想对分组数据执行其他操作(如计数、筛选或排序)时,GroupBy 就会变得更加强大。 您可以通过将 GroupBy 与其他 LINQ 方法相结合或使用匿名类型对多个属性进行分组来实现这一目标。
需要注意的是,GroupBy 使用延迟执行,在按给定键迭代时处理项目。 这意味着调用 GroupBy 方法时不会立即执行分组操作。 例如,在foreach 循环中,执行被推迟,直到对分组数据进行遍历。这种行为非常高效,因为它允许在最终处理数据之前进一步优化和修改查询。
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
让我们扩展一下之前按年龄关键值对学生进行分组的例子。 将学生分组后,我们将使用 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
在本例中,我们首先使用GroupBy方法将学生按年龄分组。 然后,我们构建一个 HTML 字符串(该方法会返回该字符串),将分组数据格式化为一份报告,其中包含每个年龄组的标题和每个组下的学生姓名列表。然后使用 IronPDF 的 ChromePdfRenderer 类将 HTML 字符串转换为 PDF 文档。 生成的 PDF 文件将保存到一个文件中,提供一份格式整洁的按年龄分组的学生报告。
以下是 IronPDF 生成的输出 PDF:
C# 中的 GroupBy 方法是一种基于指定键对数据进行分组的通用而强大的工具。 无论您是喜欢使用 lambda 表达式的方法语法,还是更喜欢声明式查询语法,GroupBy 都能让您以易于管理和阅读的方式组织复杂的数据结构。 通过掌握 GroupBy 和其他 LINQ 方法,您可以大大提高在 C# 应用程序中操作和分析数据的能力。
IronPDF 提供了一个免费试用对于那些希望在购买前了解其功能的人来说,翻译必须是专业的。 对于那些准备将其集成到自己项目中的人来说,许可证起价为 $749,使其成为在 C# 应用程序中进行专业级 PDF 操作和生成的一项值得投资的项目。