.NET 幫助

C# 分組(適用於開發者的工作原理)

在 C# 中,GroupBy 方法 是一個強大的工具,可以根據指定的鍵將數據來源中的元素組織成組。 此方法是 LINQ(語言集成查詢)的一部分,可用於按單一屬性或多個屬性對項目進行分組,對於數據分析和操控非常有價值。 GroupBy 方法簡化了複雜的數據操作,允許根據特定標準有效地組織和檢索數據。 我們將在本博客中討論 GroupBy 和IronPDF Library

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

在這段程式碼中,查詢語法按年齡對學生進行分組,類似於方法語法,但使用不同的語法,一些人覺得這樣更易讀。

按多個鍵和屬性分組

更高級的 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
$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();

        // 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
$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()
    {
        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
$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 為那些希望在購買前探索其功能的人提供免費試用。 對於那些準備將其整合到專案中的人,授權從$749開始,是在C#應用程式中進行專業級PDF操作和生成的值得投資。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
IndexOf C#(如何為開發人員工作)
下一個 >
C# Imap(開發人員如何運作)