跳過到頁腳內容
.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}");
            }
        }
    }
}
$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 與其他 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核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me