今回は、C#のLINQ(統合言語クエリ)の使い方についてご紹介します。
C#におけるLINQは、配列やリストなどのオブジェクトコレクションだけでなく、XMLやデータベースに対しても統一的なクエリを記述できる機能です。
さまざまなデータソースを対象に、フィルタリングや並べ替え、集計などを手早く行えることが大きな特徴です。
ここでは、基本的な構文やよく使うメソッドの例を交えながら、C#のLINQを活用するポイントをご紹介します。
LINQとは?
LINQ(Language Integrated Query)は、.NET言語に統合されたクエリ言語です。
SQLライクな構文(クエリ構文)とメソッドチェーンを利用する構文(メソッド構文)の2種類が存在し、それぞれ好みに応じて使い分けが可能です。
配列やリストはもちろん、LINQ to SQLやLINQ to Entitiesのようにデータベースアクセスにも応用されており、コードの可読性や型安全性を向上させます。
基本的な使い方
LINQには大きく分けてクエリ構文とメソッド構文の2つの書き方があります。
クエリ構文はSQL文に似た見た目で、以下のように記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
int[] numbers = { 1, 2, 3, 4, 5, 6 }; var evenNumbersQuery = from n in numbers where n % 2 == 0 select n; // evenNumbersQuery は偶数のみを抽出したクエリ foreach (var num in evenNumbersQuery) { Console.WriteLine(num); // 出力される値: 2, 4, 6 } |
2
4
6
一方、メソッド構文は拡張メソッドを使い、メソッドチェーンの形で書きます。
同じ結果を得る処理でも、以下のように記述することが可能です。
1 2 3 4 5 6 7 8 9 |
int[] numbers = { 1, 2, 3, 4, 5, 6 }; var evenNumbersMethod = numbers.Where(n => n % 2 == 0); // evenNumbersMethod も偶数のみを抽出したクエリ foreach (var num in evenNumbersMethod) { Console.WriteLine(num); // 出力される値: 2, 4, 6 } |
2
4
6
実用的な使用例
実際のプログラムでは、フィルタリングや並べ替え、グループ化など、さまざまな場面でLINQが活躍します。
ここでは2つの例をご紹介します。
WhereとSelectの活用
特定の条件を満たす要素のみを抽出しつつ、別の形式に変換する方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; using System.Linq; public class Sample { public static void Main() { // サンプルデータ: スコアの配列 int[] scores = { 45, 80, 75, 100, 90, 65 }; // 80点以上のスコアのみ取り出し、それを文字列に変換 var highScoresText = scores .Where(score => score >= 80) .Select(score => $"High Score: {score}"); foreach (var text in highScoresText) { Console.WriteLine(text); } } } |
High Score: 80
High Score: 100
High Score: 90
このように、Whereメソッドで条件に合致する要素だけを抽出し、Selectでフォーマットを変更しています。
GroupByでのグルーピング
同じキーを持つデータをまとめて処理する例です。
例えば、従業員データを部門ごとに集約し、部門名と従業員の名前を出力するケースを考えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System; using System.Linq; using System.Collections.Generic; public class Employee { public string Name { get; set; } public string Department { get; set; } } public class Sample { public static void Main() { // サンプルデータ: 従業員リスト List<Employee> employees = new List<Employee> { new Employee { Name = "Alice", Department = "Sales" }, new Employee { Name = "Bob", Department = "Sales" }, new Employee { Name = "Charlie", Department = "HR" }, new Employee { Name = "Diana", Department = "HR" }, new Employee { Name = "Edward", Department = "IT" } }; // 部門ごとにグループ化 var groups = employees.GroupBy(e => e.Department); foreach (var group in groups) { Console.WriteLine($"Department: {group.Key}"); foreach (var emp in group) { Console.WriteLine($" {emp.Name}"); } } } } |
Department: Sales
Alice
Bob
Department: HR
Charlie
Diana
Department: IT
Edward
このように、GroupByを使うことでキーに応じたグループを作成でき、まとめて表示や集計が行えます。
LINQを利用する際の注意点
LINQを使いこなすうえでは、以下のような点に注意する必要があります。
- 遅延実行:クエリの定義時点では実行されず、列挙(foreachなど)やToList()で明示的に評価するタイミングまで処理が行われません。結果を早期に確定したい場合はToList()やToArray()を使います。
- パフォーマンス:複雑なクエリや大量のデータソースに対しては、処理時間やメモリ消費に注意が必要です。必要に応じてクエリ分割やキャッシュを検討します。
- 対象データソースの違い:LINQ to Objects、LINQ to SQL、LINQ to Entitiesなど、接続先によってサポートされる機能や動作が異なります。
- 例外処理:クエリが実行されるタイミングでエラーが起こる可能性もあるため、例外処理の実装を適切に行う必要があります。
まとめ
LINQを利用すると、配列やリストはもちろん、さまざまなデータソースを対象に直感的かつ統一的なコードを書けます。
フィルタリングや並べ替え、グルーピングなど、多彩な操作を簡潔に記述できる点が大きな利点です。
ただし、遅延実行やデータソースごとの違いなどを踏まえたうえで、適切な実装を行うことが大切です。