跳過到頁腳內容
.NET幫助

C# Groupby(對於開發者的運行原理)

在 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

C# GroupBy(對開發人員的運作方式): 圖 1 - 來自先前代碼示例的控制台輸出

LINQ GroupBy 方法使用 lambda 表達式按 Age 鍵值將學生分組。 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

在這段代碼中,查詢語法按 Age 分組學生,類似於方法語法,但語法不同,某些人認為更可讀。

按多個鍵和屬性分組

更加高級的 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 變得更強大。 您可以透過與其他 LINQ 方法組合 GroupBy 或使用匿名類型按多個屬性進行分組來實現這一點。

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");
    }
}
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(對開發人員的運作方式): 圖 3 - 來自先前代碼示例的輸出 PDF

結論

C# GroupBy(對開發人員的運作方式): 圖 4 - IronPDF 許可計劃

C# 中的 GroupBy 方法是一個多用途和強大的工具,用於按指定鍵對資料進行分組。 無論您喜歡使用帶有 lambda 表達式的方法語法還是更聲明性的查詢語法,GroupBy 使您能夠以可管理和可讀的方式組織複雜的資料結構。 透過掌握 GroupBy 和其他 LINQ 方法,您可以顯著增強在 C# 應用程式中操作和分析資料的能力。

IronPDF 提供 免費試用版,適合那些想要探索其功能而未購買的人。 對那些準備將其整合到專案中的人,許可開始於 $799,這是對專業級別 PDF 操作和生成 C# 應用程式的有價值的投資。

常見問題解答

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 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。