.NET ヘルプ

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

公開済み 2024年4月3日
共有:

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

GroupByの基本

GroupByメソッドの本質は、指定されたキーに従って与えられたコレクションの要素をグループに分類する能力にあります。 この主要なプロパティは、項目のグループ化方法を決定します。 例えば、学生の一覧をその年齢キーの値でグループ化し、同じ年齢の学生のクラスターを作成することができます。 各グループはキー値と、そのキーを共有する項目のコレクションによって表されます。 キーのプロパティには、文字列、数字、または無名オブジェクトなど、どんなオブジェクトでも使用できるため、データのグループ分けに柔軟性が生まれます。

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

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

C# GroupBy(開発者のための仕組み):図1 - 前のコード例のコンソール出力

LINQのGroupByメソッドは、ラムダ式を使用して学生をその年齢キー値でグループ化します。 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}");
        }
    }
}
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
		}
	}
	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
VB   C#

このスニペットでは、クエリ構文はAgeで学生をグループ化します。これはメソッド構文と同様ですが、構文が異なるため、より読みやすいと感じる人もいます。

複数のキーおよびプロパティによるグルーピング

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}");
        }
    }
}
Public Shared 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
		}
	}
	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
VB   C#

この例では、匿名型をキーとして使用し、学生が名前と年齢ごとにグループ化されています。 これにより、名前と年齢の各ユニークな組み合わせが別々のグループとして表され、複雑なグループ化シナリオにおけるGroupByの柔軟性が示されます。

追加のGroupBy情報

高度なGroupByの使用

GroupByは、複数のキー値でグループ化する必要がある場合や、グループ化されたデータに対してカウント、フィルタリング、順序付けなどの追加操作を実行したい場合にさらに強力になります。 この機能は、GroupByを他のLINQメソッドと組み合わせるか、匿名型を使用して複数のプロパティでグループ化することにより達成できます。

グループ化での遅延実行

GroupByが遅延実行を利用し、指定されたキーで反復処理されるときに項目を処理することに注意することが重要です。 これは、GroupByメソッドが呼び出されたときにグループ化操作が即座に実行されないことを意味します。 代わりに、実行はデータが例えばforeachループで繰り返されるまで延期されます。この動作は効率的であり、最終的にデータが処理される前にさらにクエリを最適化および修正することを可能にします。

C#プロジェクトへのIronPDFの導入

C#グループバイ(開発者のための仕組み):図2 - IronPDFのウェブページ

IronPDFは、開発者が .NET アプリケーション内で PDF ドキュメントを作成、操作、および変換することを可能にする包括的な C# ライブラリです。 この強力なツールは、幅広い機能を提供します。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");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. 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")

		' 2. 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")

		' 3. 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
VB   C#

グループ化されたデータからの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}");
    }
}
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()
		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
			}
		}
		Dim groupedResult = studentList.GroupBy(Function(student) student.Age)
		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
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		Dim outputPath = "StudentReport.pdf"
		pdf.SaveAs(outputPath)
		Console.WriteLine($"PDF report generated at {outputPath}")
	End Sub
End Class
VB   C#

この例では、まず GroupBy メソッドを使用して学生を年齢ごとにグループ化します。 次に、HTML文字列を構築し、各年齢グループの見出しと各グループの学生名のリストを含むレポートとして、このグループ化されたデータを整形します。IronPDFのChromePdfRendererクラスを使用して、このHTML文字列をPDFドキュメントに変換します。 生成されたPDFはファイルに保存され、学生が年齢別にグループ化されたわかりやすいフォーマットのレポートが提供されます。

出力

こちらがIronPDFによって生成された出力PDFです。

C# GroupBy(開発者のための仕組み):図3 - 前のコード例から出力されたPDF

結論

C#グループバイ(開発者向けの仕組み):図4 - IronPDFライセンスプラン

C#のGroupByメソッドは、指定されたキーに基づいてデータをグループ化するための汎用的で強力なツールです。 ラムダ式を用いたメソッド構文を好む場合でも、より宣言的なクエリ構文を好む場合でも、GroupByは複雑なデータ構造を管理しやすく、読みやすい形で整理することができます。 GroupByやその他のLINQメソッドを習得することで、C#アプリケーションにおけるデータの操作と分析の能力を大幅に向上させることができます。

IronPDFは、無料体験購入を決定する前に機能を試してみたい方のために。 プロジェクトに統合する準備が整った方には、ライセンスは$liteLicenseから始まり、C#アプリケーションでプロ並みのPDF操作および生成を行うための価値ある投資となります。

< 以前
IndexOf C#(開発者向けの動作方法)
次へ >
C# Imap (開発者向けの仕組み)