C# LINQ入門:Where でデータを簡単に絞り込む


var even = numbers.Where(n => n % 2 == 0);をやさしく解説


はじめに

C# を学び始めたばかりの方にとって、次のような1行コードを見て「なにこれ?」と思うことがあるかもしれません。

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

このコードは、LINQ(リンク)と呼ばれる便利な文法を使って、リストの中から偶数だけを取り出しています。

この記事では、この1行の意味を初学者向けに丁寧に解説します。


そもそも LINQ とは?

LINQ(Language Integrated Query)は、C# に組み込まれた コレクション操作のための道具です。

  • 配列や List などから、条件に合うデータだけを取り出したり、
  • 並び替えたり、
  • 集計したりすることができます。

LINQ を使えば、for や foreach の代わりに、直感的に書けるのが大きなメリットです。


実行例コード:偶数だけを抽出する

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

コードを一つずつ分解して理解しよう

numbers

これは、整数のリストです。

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

この中から「偶数だけを取り出したい」というのが目的です。


Where とは?

LINQ のメソッドの1つで、「条件に合うものだけを選ぶ」ために使います。

  • 「偶数だけ欲しい」
  • 「5より大きいものだけ取りたい」

など、絞り込み処理に使われます。


n => n % 2 == 0 とは?

これは ラムダ式 と呼ばれます。

n => n % 2 == 0

は、次の同じです

n => (n % 2 == 0)

は、「n を順番に見て、n が偶数なら true」という意味になります。

  • n は numbers の中の1つ1つの数字(1, 2, 3…)
  • n % 2 == 0 は「n を2で割った余りが0か」→ 偶数かどうかのチェック

var even = … とは?

この1行は、こう読むとわかりやすくなります:

numbers の中から「偶数だけを抽出して」even に入れる

even は IEnumerable<int> 型の変数になります(後で foreach で使えるリストのようなもの)。


同じ処理を従来の方法で書くと…

LINQ を使わずに書くと、こうなります:

List<int> even = new List<int>();
foreach (int n in numbers)
{
    if (n % 2 == 0)
    {
        even.Add(n);
    }
}

→ LINQ を使えば、この5行が1行に短縮でき、コードが読みやすくなります。


まとめ表

部分意味
numbers数のリスト(1, 2, 3, 4, 5)
.Where(…)条件に合うものだけを選び出す
n => n % 2 == 0各要素 n が偶数かどうかをチェックする
var even = …偶数だけを集めたデータを even に入れる

よくある質問:ラムダ式って何?

ラムダ式(=> 記号)は、「1つずつ調べて条件を満たすか」 を書くためのものです。

最初は難しそうに見えますが、n => 条件 は「1つずつ n を調べて条件を見る」という風に覚えましょう。


おわりに

LINQ を使えば、配列やリストの操作がとてもシンプルに書けるようになります。

まずは今回紹介した Where() を使って、「条件に合うものを取り出す」練習から始めてみましょう。

次は、Select()(データの形を変える)や OrderBy()(並び替え)にもチャレンジしてみてください。


補足:忘れずに書こう!

LINQ を使うには、usingディレクティブが必要です:

using System.Linq;
訪問数 4 回, 今日の訪問数 1回

C#,LINQ

Posted by hidepon