跳至頁尾內容
.NET 幫助

C# Groupby(開發者使用方法)

在 C# 中,GroupBy 方法是一個功能強大的工具,可根據指定的關鍵將資料來源中的元素組織成群組。 此方法是 LINQ(語言整合查詢)的一部分,可用於將項目依單一或多個屬性進行群組,對於資料分析與處理而言非常有價值。 GroupBy 方法簡化了複雜的資料作業,允許根據特定條件進行有效的資料組織和檢索。 我們將在這篇部落格中討論 GroupBy 和 IronPDF Library

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

C# GroupBy (How It Works For Developers):圖 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}");
            }
        }
    }
}
$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}");
            }
        }
    }
}
$vbLabelText   $csharpLabel

在這個範例中,以匿名類型為關鍵,將學生依姓名和年齡分組。 結果是每個名稱和年齡的獨特組合都代表一個獨立的群組,展現出 GroupBy 在複雜群組情況下的彈性。

額外的 GroupBy 資訊

進階 GroupBy 使用方式

當您需要以多個關鍵值進行群組,或想要對群組資料執行其他操作(例如計數、篩選或排序)時,GroupBy 就會變得更加強大。 您可以透過將 GroupBy 與其他 LINQ 方法結合,或使用匿名類型以多個屬性進行群組,來達到此目的。

GroupBy 中的延遲執行

值得注意的是,GroupBy 採用延遲執行的方式,在以指定的關鍵迭代時處理項。 這表示在呼叫 GroupBy 方法時,不會立即執行群組操作。 相反地,執行會延遲到群組資料被遍歷之後,例如在 foreach 環路中。這種行為很有效率,因為它允許在資料最後被處理之前進行進一步的查詢最佳化和修改。

將 IronPDF 介紹給 C# 專案。

C# GroupBy (How It Works For Developers):圖 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 (How It Works For Developers):圖 3 - 上一個程式碼範例輸出的 PDF

結論

C# GroupBy (How It Works For Developers):圖 4 - IronPDF 授權計劃

C# 中的 GroupBy 方法是一個多功能且功能強大的工具,用來根據指定的關鍵對資料進行分組。 無論您是偏好使用 lambda 表達式的方法語法,還是更偏好宣告式的查詢語法,GroupBy 都能讓您以易於管理和閱讀的方式組織複雜的資料結構。 透過掌握 GroupBy 和其他 LINQ 方法,您可以大幅提升在 C# 應用程式中處理和分析資料的能力。

IronPdf 提供免費試用,供希望在購買前瞭解其功能的人士使用。 對於那些準備將其整合到專案中的人而言,$799的授權起始價格,使其成為在 C# 應用程式中進行專業級 PDF 操作和生成的一項值得投資的項目。

常見問題解答

C# 中的 GroupBy 方法是什麼?

在 C# 中,GroupBy 方法是 LINQ 的一項功能,它可以根據指定的鍵將資料來源中的元素組織成群組,從而簡化資料分析和操作。

C# 中 GroupBy 方法如何使用方法語法?

使用帶有 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 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。