C# 入門:LINQ を使ってコレクション操作をスマートに

コレクション操作をスマートに「ループ+if」からの卒業! データ操作をもっと簡単・直感的に


はじめに

C# で配列や List<T> を操作するとき、次のようなコードを書いた経験はありませんか?

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
List<int> even = new List<int>();

foreach (var n in numbers)
{
    if (n % 2 == 0)
    {
        even.Add(n);
    }
}

このような処理を、1行で、もっと直感的に書けるようにするのが LINQ(Language Integrated Query) です。


LINQ とは?

LINQ(リンク)は、C# に組み込まれた データ操作のための文法 です。

  • 配列やリストからの「抽出」「並び替え」「集計」などを、簡潔に記述できます。
  • SQL に似た表現も可能なので、データベースを扱う前の練習にも最適です。

基本構文(メソッド構文)

var 結果 = コレクション.Where(条件).Select(取り出す形);

例:偶数だけを抽出する

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

        var even = numbers.Where(n => n % 2 == 0);

        foreach (var n in even)
        {
            Console.WriteLine(n);
        }
    }
}

実行結果:

2  
4

主な LINQ メソッド一覧(よく使うもの)

メソッド名説明使用例
Where条件で絞り込み.Where(x => x > 10)
Select要素の形を変換(マッピング).Select(x => x * 2)
OrderBy昇順ソート.OrderBy(x => x)
OrderByDescending降順ソート.OrderByDescending(x => x)
FirstOrDefault最初の要素を取得(なければ null または default).FirstOrDefault()
Any条件に一致する要素があるか?.Any(x => x == 0)
Count要素数(条件付きでも可).Count(x => x > 5)
ToList結果を List に変換.Where(…).ToList()

例:文字列リストから特定の文字を含むものを抽出

List<string> names = new List<string> { "佐藤", "鈴木", "田中", "高橋" };

var filtered = names.Where(n => n.Contains("田"));

foreach (var name in filtered)
{
    Console.WriteLine(name);
}

実行結果:

田中

応用例:Select を使って名前に「さん」をつける

var politeNames = names.Select(n => n + "さん");

foreach (var name in politeNames)
{
    Console.WriteLine(name);
}

enum + LINQ:状態ごとのフィルターにも使える

enum State { Idle, Active, Finished }

class Task
{
    public string Title { get; set; }
    public State Status { get; set; }
}

List<Task> tasks = new List<Task>
{
    new Task { Title = "書類作成", Status = State.Active },
    new Task { Title = "掃除", Status = State.Finished },
    new Task { Title = "資料読み", Status = State.Active }
};

var activeTasks = tasks.Where(t => t.Status == State.Active);

foreach (var task in activeTasks)
{
    Console.WriteLine(task.Title);
}

実行結果:

書類作成  
資料読み

LINQ のメリット

項目内容
コードが短いforeach や if をまとめて1行で書ける
可読性が高い「何をしているか」が一目でわかる
安全性要素数ゼロでも例外を出さずに処理できる
連結可能メソッドチェーンで複雑な処理も段階的に記述

注意点

  • Where() などの操作は「遅延評価」される → 実際に foreach などで使うまで実行されない
  • ToList() を付けるとすぐにリスト化できる(遅延評価しない)

練習問題

Q1. 次の整数リストから 3 の倍数だけを抽出して、降順で表示せよ

List<int> numbers = new List<int> { 1, 3, 6, 7, 9, 10, 12 };

var result = numbers
    .Where(n => n % 3 == 0)
    .OrderByDescending(n => n);

foreach (var n in result)
{
    Console.WriteLine(n);
}

実行結果:

12  
9  
6  
3

おわりに

LINQ は「データをどう扱うか」を 簡潔・直感的に書くための必須スキル です。

List と組み合わせて使えば、複雑な処理でもシンプルに書けます。

初学者のうちは、まずは Where()、Select()、OrderBy() だけでも使いこなせるようになると、コーディングの幅が大きく広がります。


補足:使うには using が必要

using System.Linq;

を忘れずに!

訪問数 1 回, 今日の訪問数 1回

C#,LINQ

Posted by hidepon