
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}");
}
}
}
}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
Next
End Sub
End ClassC# 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}");
}
}
}
}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 {.Age = ageGroup.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
Next
End Sub
End Module
Public Class Student
Public Property Name As String
Public Property Age As Integer
End Classこのスニペットでは、クエリ構文によって、メソッド構文と同様に学生が年齢によってグループ化されますが、異なる構文を持っており、一部の人々にはより読みやすく見えるかもしれません。
複数のキーとプロパティによるグループ化
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}");
}
}
}
}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
Next
End Sub
End Moduleこの例では、匿名の型をキーとして使用して、名前と年齢によって学生がグループ化されます。 これにより、名前と年齢の一意の組み合わせごとに別々のグループとして表されるグループが作成され、複雑なグループ化シナリオに対応するためのGroupByの柔軟性が示されます。
追加のGroupBy情報
高度なGroupByの使用
複数のキー値によってグループ化する必要がある場合や、グループ化データに対して追加の操作を実行したい場合、たとえばカウント、フィルタリング、または順序付けを行う際に、GroupByはさらに強力なものとなります。 これを達成するために、他のLINQメソッドとGroupByを組み合わせたり、複数のプロパティによってグループ化するために匿名の型を使用したりすることができます。
GroupByの遅延実行
GroupByが遅延実行を利用しており、指定されたキーによって反復される際にアイテムを処理することに注意することが重要です。 これは、GroupByメソッドが呼び出された際にグループ化操作が直ちに実行されないことを意味します。 代わりに、グループ化されたデータが反復されるまで、例えばforeachループで、実行は遅延されます。この挙動は効率的であり、データが最終的に処理される前にさらなるクエリ最適化と変更を可能にします。
IronPDFのC#プロジェクトへの導入
C# GroupBy (開発者向けの働き): 図2 - IronPDFウェブページ
IronPDFは、C#用の包括的なライブラリで、開発者が.NETアプリケーション内でPDFドキュメントを作成、操作、変換することを可能にします。 この強力なツールは、HTMLからPDFを生成することから既存のPDFファイルを編集することまで、幅広い機能を提供します。 IronPDFはあなたのアプリケーションにPDF機能を統合することを簡略化し、PDF操作を必要とするプロジェクトにとって貴重な資産となります。
IronPDFの主な機能は、レイアウトとスタイルが保持されるHTMLからPDF変換です。 Webコンテンツから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");
}
}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グループ化データからの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}");
}
}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 As String = "<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
htmlContent += "</ul>"
Next
' Initialize IronPDF renderer and generate PDF
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' Specify path to save the PDF file
Dim outputPath As String = "StudentReport.pdf"
pdf.SaveAs(outputPath)
Console.WriteLine($"PDF report generated at {outputPath}")
End Sub
End Classこの例では、最初にGroupByメソッドを使用して学生を年齢でグループ化します。 次に、メソッドが返すHTML文字列を構築し、このグループ化されたデータを報告書としてフォーマットし、各年齢グループの見出しとその下にある学生名のリストを持たせます。次に、IronPDFのChromePdfRendererクラスを使用して、このHTML文字列をPDFドキュメントに変換します。 結果として得られるPDFはファイルに保存され、年齢でグループ化された学生のきれいにフォーマットされたレポートを提供します。
出力
以下に、IronPDFで生成されたPDFの出力を示します。
C# GroupBy (開発者向けの働き): 図3 - 前回のコード例から出力されたPDF
結論
C# GroupBy (開発者向けの働き): 図4 - IronPDFライセンスプラン
C#のGroupByメソッドは、指定されたキーに基づいてデータをグループ化するための多用途で強力なツールです。 ラムダ式を用いたメソッド構文を好むか、より宣言的なクエリ構文を好むかにかかわらず、GroupByは複雑なデータ構造を管理しやすく読みやすい方法で整理することを可能にします。 GroupByや他のLINQメソッドを習得することで、C#アプリケーションにおけるデータの操作と分析の能力を大幅に向上させることができます。
IronPDFは、購入を決定する前にその機能を探索したい人のために無料トライアルを提供しています。 プロジェクトに統合する準備ができている方には、ライセンスは$999から始まり、C#アプリケーションでのプロフェッショナルなPDF操作や生成にとって価値ある投資です。

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。
関連する記事


