フッターコンテンツにスキップ
.NETヘルプ

C# Groupby(開発者向けの動作方法)

C#では、GroupByメソッドは、指定されたキーに基づいてデータソースの要素をグループに整理する強力なツールです。 このメソッドはLINQ (Language Integrated Query) の一部であり、単一のプロパティまたは複数のプロパティによってアイテムをグループ化することができ、データ分析と操作に非常に有用です。 GroupByメソッドは複雑なデータ操作を簡略化し、特定の基準に基づいて効率的なデータの組織化と取得を可能にします。 このブログでは、GroupByとIronPDFライブラリについて話し合います。

GroupByの基本

GroupByメソッドの本質は、指定されたキーに従って、特定のコレクションの要素をグループに分類する能力にあります。 このキーのプロパティは、アイテムのグループ化方法を決定します。 たとえば、学生のリストを年齢キーの値でグループ化し、同じ年齢の学生のクラスターを作成することができます。 各グループはキーの値と、そのキーを共有するアイテムのコレクションによって表されます。 キーのプロパティは、文字列、数値、または匿名オブジェクトのように、データがどのようにグループ化されるかにおいて柔軟性を提供する任意のオブジェクトになり得ます。

メソッド構文を使用したGroupBy使用法

C#では、GroupByメソッドを適用するには、メソッド構文とクエリ構文の2つの方法があります。 メソッド構文は、グループ化キーを定義するためのラムダ式を使用し、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メソッドは、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

このスニペットでは、クエリ構文によって、メソッド構文と同様に学生が年齢によってグループ化されますが、異なる構文を持っており、一部の人々にはより読みやすく見えるかもしれません。

複数のキーとプロパティによるグループ化

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ループで、実行は遅延されます。この挙動は効率的であり、データが最終的に処理される前にさらなるクエリ最適化と変更を可能にします。

C#プロジェクトへのIronPDFの紹介

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メソッドは、指定されたキーに基づいてデータをグループ化するための多用途で強力なツールです。 ラムダ式を使用したメソッド構文や、より宣言的なクエリ構文を好むかどうかにかかわらず、GroupByは、複雑なデータ構造を管理可能で読みやすい形に整理することを可能にします。 GroupByや他のLINQメソッドを習得することで、C#アプリケーションにおけるデータの操作と分析の能力を大幅に向上させることができます。

IronPDFは、購入を決定する前にその機能を探索したい人のために無料トライアルを提供しています。 プロジェクトに統合する準備ができた人のために、ライセンスは$799から始まり、C#アプリケーションにおけるプロフェッショナル・グレードのPDF操作と生成を行う価値ある投資となります。

よくある質問

C# における GroupBy メソッドとは何ですか?

C# では、GroupBy メソッドは LINQ の機能であり、指定されたキーに基づいてデータ ソースの要素をグループ化し、データの分析と操作を簡素化します。

C# のメソッド構文で GroupBy メソッドはどのように機能しますか?

メソッド構文でラムダ式を使用して、GroupBy メソッドは指定されたキーで要素をグループ化します。たとえば、学生のリストを年齢でグループ化し、同じ年齢の学生のクラスタを作成できます。

GroupBy メソッドでクエリ構文を使用できますか?

はい、クエリ構文を GroupBy メソッドで使用することができ、特に複雑なデータ変換のために、より SQL に似た表現力のある方法でグループ化操作を実行できます。

複数のキーを使用してデータをグループ化するにはどうすれば良いですか?

匿名オブジェクトやタプルを使用することでデータを複数のキーでグループ化でき、プロパティの組み合わせに基づく詳細なデータ解析が可能となります。

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(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。