前回は「例外処理」と「ジェネリック」を解説しました。今回は、C#で最も強力な機能の一つであり、データ操作を劇的に簡単にする「LINQ (Language Integrated Query)」について解説します。
14. LINQ (Language Integrated Query)
LINQは、C#コード内でデータベース(SQL)やXML、メモリ上のコレクション(配列、リストなど)に対して、統一されたクエリ(問い合わせ)構文を使ってデータを操作できるようにする機能です。
プログラミング言語の機能として統合されているため、SQLのような外部言語を覚える必要がなく、安全で読みやすいコードを書けます。
📄 LINQの基本:クエリ構文 vs メソッド構文
LINQには主に2種類の書き方がありますが、実務では柔軟性の高いメソッド構文が主流です。
構文 | 特徴 |
クエリ構文 | SQLに似ており、英語の文章のように読める。from ... where ... select の順で書く。 |
メソッド構文 | メソッドチェーン(.Where().Select()... )で繋いでいく書き方。ラムダ式と組み合わせて使用し、より柔軟な処理が可能。 |
Google スプレッドシートにエクスポート
🔍 メソッド構文の例(リスト操作)
ここでは、リスト内の整数データを使って基本的な操作を見ていきます。
C#
using System.Linq; // LINQを使うために必須
using System.Collections.Generic;
List<int> numbers = new List<int> { 5, 12, 8, 20, 3 };
// ----------------------------------------------------
// 1. Where (絞り込み/フィルター)
// ----------------------------------------------------
// 10より大きい数値だけを抽出する
// (n => n > 10) はラムダ式。リストの要素nを受け取り、n > 10が真なら採用
IEnumerable<int> largeNumbers = numbers.Where(n => n > 10);
System.Console.WriteLine("10より大きい数:");
foreach (var n in largeNumbers)
{
System.Console.WriteLine(n); // 出力: 12, 20
}
// ----------------------------------------------------
// 2. Select (射影/変換)
// ----------------------------------------------------
// 各数値を2倍にした新しいリストを作成する
IEnumerable<int> doubledNumbers = numbers.Select(n => n * 2);
System.Console.WriteLine("2倍にした数:");
foreach (var n in doubledNumbers)
{
System.Console.WriteLine(n); // 出力: 10, 24, 16, 40, 6
}
// ----------------------------------------------------
// 3. OrderBy (並べ替え)
// ----------------------------------------------------
// 数値を昇順に並べ替える
IEnumerable<int> sortedNumbers = numbers.OrderBy(n => n);
System.Console.WriteLine("ソート結果:");
foreach (var n in sortedNumbers)
{
System.Console.WriteLine(n); // 出力: 3, 5, 8, 12, 20
}
// ----------------------------------------------------
// 4. Count / Sum (集計)
// ----------------------------------------------------
// 10以上の要素の数をカウント
int count = numbers.Count(n => n >= 10); // 結果: 2
// 全要素の合計値を計算
int sum = numbers.Sum(); // 結果: 48
🎯 クラスに対するLINQ操作の例
クラスのリストに対してLINQを使うことで、データベースの検索のような複雑な処理を簡潔に書けます。
C#
public class Employee
{
public string Name { get; set; }
public int Salary { get; set; }
public string Department { get; set; }
}
List<Employee> employees = new List<Employee>
{
new Employee { Name = "佐藤", Salary = 500, Department = "開発" },
new Employee { Name = "田中", Salary = 700, Department = "営業" },
new Employee { Name = "山本", Salary = 450, Department = "開発" }
};
// 1. 開発部門の従業員を抽出し、給料が高い順に並べる
var result = employees
.Where(e => e.Department == "開発") // 開発部門に絞り込み
.OrderByDescending(e => e.Salary) // 給料を降順(高い順)に並べ替え
.Select(e => e.Name); // 名前だけを抽出
System.Console.WriteLine("給料の高い順に開発メンバー:");
// 出力: 佐藤, 山本
foreach (var name in result)
{
System.Console.WriteLine(name);
}
💡 LINQの重要な概念:遅延実行
LINQのクエリ(Where
やSelect
)は、実行が遅延されるという特徴があります。
- クエリを定義しただけでは、データは処理されません。
foreach
で結果を取り出したり、ToList()
,Count()
,Sum()
などの実行メソッドが呼ばれたときに、初めてデータ処理が実行されます。
これにより、必要なデータだけを効率的に処理でき、特にデータベースと連携する際に高いパフォーマンスを発揮します。
次回は、C#での非同期処理の基本である「async
/ await
」について解説します。