C#-6

前回は「例外処理」と「ジェネリック」を解説しました。今回は、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のクエリ(WhereSelect)は、実行が遅延されるという特徴があります。

  • クエリを定義しただけでは、データは処理されません。
  • foreachで結果を取り出したり、ToList(), Count(), Sum()などの実行メソッドが呼ばれたときに、初めてデータ処理が実行されます。

これにより、必要なデータだけを効率的に処理でき、特にデータベースと連携する際に高いパフォーマンスを発揮します。

次回は、C#での非同期処理の基本である「async / await」について解説します。