跳至頁尾內容
開發者更新

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變得更加強大。 您可以透過將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");
    }
}
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提供免費試用,供想在購買前探索其功能的人使用。 對於準備將其整合到項目中的人來說,授權價格始於$999,這使其成為專業級PDF操作和生成的C#應用程式的值得投資。

常見問題

什麼是C#中的GroupBy方法?

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

GroupBy方法如何與C#中的方法語法配合運作?

使用帶有lambda表達式的方法語法,GroupBy方法根據指定的鍵對元素進行分組。例如,您可以將學生列表根據年齡分組,建立年齡相近的學生組。

您可以使用查詢語法配合GroupBy方法嗎?

是的,查詢語法可以與GroupBy方法一起使用,提供一種更類似SQL且更具表達性的方式來執行分組操作,特別是對於複雜的資料轉換。

如何使用GroupBy根據多個鍵分組資料?

您可以通過使用匿名物件或元組來根據多個鍵對資料進行分組,允許進行更詳細的資料分析。

在GroupBy的上下文中,什麼是延遲執行?

延遲執行意味著GroupBy操作在調用時不會立即執行。當被分組資料進行迭代時才會被處理,允許進行查詢優化。

如何使用C#生成分組資料的PDF報告?

您可以使用IronPDF將格式化分組資料的HTML字串轉換為PDF文件,從而輕鬆生成格式整齊的PDF報告,這些報告來自於使用GroupBy分組的資料。

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一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話