LINQを使った場合と使わなかった場合の比較

2025年1月23日

C# の学習を進めると「LINQ」という機能があることに気づきます。
ここでは、LINQ の仕組みを細かく理解せずに、コードの違いを見比べることで学んでみましょう。

例:数値から 50 以上を抽出する

次の数値列のうち、50以上のものだけを抜き出し、新しいリストを作成してみます。

12, 56, 75, 8, 1, 95, 32, 85, 24, 49

Where メソッド(要素をフィルタリングして別のデータ群にする)

LINQ を使って導き出した場合

var nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
var query = nums.Where(n => n >= 50);

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

このコードは、List<int> 型の変数 nums に整数が格納されているとして、その中から 50 以上の数値を取り出して表示するプログラムです。

  1. var nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
    • List<int> 型の変数 nums を定義し、12・56・75・8・1・95・32・85・24・49 を要素として格納しています。
  2. var query = nums.Where(n => n >= 50);
    • nums から 50 以上の数値を取り出し、変数 query に格納しています。
    • Where メソッドは、指定した条件(ここでは n >= 50)を満たす要素のみを抽出するメソッドです。
  3. foreach (var n in query)
    • query に格納された要素を順番に取り出し、変数 n に代入します。
  4. Console.WriteLine(n);
    • 取り出した数値を改行しながら表示します。

実行結果

56
75
95
85

LINQ を使わなかった場合

List<int> nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
List<int> query = new List<int>();

foreach (var n in nums)
{
    if (n >= 50)
    {
        query.Add(n);
    }
}

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

このコードは、List<int> 型の nums に整数リストを代入し、それを使って 50 以上の整数を抽出するものです。

  1. List<int> nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };
    • nums に整数のリストを格納しています。
  2. foreach (var n in nums)if (n >= 50)
    • nums の要素を 1 つずつ取り出し、50 以上であれば query に追加しています。
  3. foreach (var n in query)
    • query に格納された要素を 1 つずつ取り出して表示しています。

解説

2 つのコードを比べると、LINQ を使わない場合は

  • ループを回して条件をチェックし、
  • 条件を満たす要素をリストに追加し、
  • さらにそれをループで出力する、
    といった手順が必要になります。

一方、LINQ を使う場合は Where を呼び出すだけで 50 以上を抽出できるため、コードが簡潔になり、「何をしたいか」が明確に表現されます。


Select メソッド(各要素を加工して別のデータ群にする)

LINQ を使って導き出した場合

var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = nums.Select(n => n * 2);

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

このコードは、nums に 1 ~ 9 の整数を格納し、その各要素を 2 倍に変換する操作を Select メソッドで行っています。
query に格納された要素を foreach で取り出し、画面に出力することで、2 倍した結果が表示されます。

実行結果

2
4
6
8
10
12
14
16
18

LINQ を使わなかった場合

List<int> nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> query = new List<int>();

foreach (var n in nums)
{
    query.Add(n * 2);
}

foreach (var n in query)
{
    Console.WriteLine(n);
}
  1. foreach (var n in nums)
    • nums の要素を 1 つずつ取り出し、2 倍した値を query に追加します。
  2. foreach (var n in query)
    • query に格納された値を 1 つずつ取り出して出力します。

解説

こちらも、LINQ を使わない場合はループを 2 回書いていますが、LINQ を使うと Select 一発で済みます。
処理を「2 倍する」という意図がコードに直接表現されるため、可読性が高まります。


もう少し正確な置換

var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

var query = nums.Select(Anonymous);

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

int Anonymous(int n)
{
    return n * 2;
}
  • Select メソッドは、要素を 2 倍する関数(ここでは Anonymous)を適用して新しいリストを生成し、query に格納します。
  • その後、query の要素を取り出して順に表示します。

「匿名関数」と呼ばれるラムダ式を直接書く代わりに、ここではわざと名前付きのメソッド Anonymous を使って表現しています。
実際には Select(n => n * 2) のように短く書くことが多いでしょう。

コード全体で見ると

var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

var query = new List<int>();

foreach (var n in nums)
{
    query.Add(Anonymous(n));
}

int Anonymous(int n)
{
    return n * 2;
}

このように書かれている処理を LINQ の Select で省略できる、という見方もできます。


コード

Where を同じように書くと

var nums = new List<int> { 12, 56, 75, 8, 1, 95, 32, 85, 24, 49 };

var query = new List<int>();

foreach (var n in nums)
{
    if (Anonymous(n))
    {
        query.Add(n);
    }
}

bool Anonymous(int n)
{
    return n >= 50;
}

この処理(要素を条件で絞り込み、リストに追加する部分)を LINQ の Where に置き換えることで、ループや条件分岐を簡潔にまとめられます。


以上のように、LINQ を使わない場合はループと条件分岐(または加工処理)を自前で書く必要がありますが、LINQ を使うと一行の記述で済むことが多くなり、コードが読みやすく保守しやすくなります。慣れてくると、より複雑な処理でも WhereSelect、その他の拡張メソッドを組み合わせることで、意図が明確なコードを書けるようになるでしょう。

C#,LINQ,学習

Posted by hidepon