.NET 幫助

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

喬迪·巴迪亞
喬迪·巴迪亞
2024年4月3日
分享:

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

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

C# GroupBy(開發人員如何運作):圖 1 - 來自前面程式碼範例的控制台輸出

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

在此片段中,查詢語法按年齡對學生進行分組,類似於方法語法,但語法不同,有些人會覺得這樣更易讀。

按多個鍵和屬性分組

更高級的 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}");
        }
    }
}

在這個例子中,使用匿名型別作為鍵,將學生按姓名和年齡分組。 這將導致形成一個個組,每個獨特的姓名和年齡組合都作為一個單獨的組來表示,展示了 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");
    }
}

從分組數據生成 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}");
    }
}

在此示例中,我們首先使用 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 操作和生成的一項值得投資的選擇。

喬迪·巴迪亞
軟體工程師
Jordi 最擅長 Python、C# 和 C++,當他不在 Iron Software 發揮技能時,他會進行遊戲編程。他負責產品測試、產品開發和研究,為持續產品改進增添了巨大的價值。多樣化的經驗使他感到挑戰和投入,他說這是與 Iron Software 合作的最喜歡的方面之一。Jordi 在佛羅里達州邁阿密長大,並在佛羅里達大學學習計算機科學和統計學。
< 上一頁
IndexOf C#(如何為開發人員工作)
下一個 >
C# Imap(開發人員如何運作)