for文からLINQへ
― 配列処理を“進化”させる ―
今日はテスト問題から、そのまま一歩進んだ話をします。
■ 今日の問題
int[] numbers = { 10, 20, 30, 40, 50, 60 };
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] > 30)
{
Console.WriteLine(numbers[i]);
}
}
何をしているコードか?
- 配列を最初から順番に見る
- 30より大きいものだけ表示する
出力は:
40
50
60
つまり、
「30より大きい数を取り出している」
これがこのコードの“本質”です。
■ 本質を見るクセをつけよう
for文はあくまで「やり方」です。
でも大事なのは、
何をしたいのか?
です。
今回やりたいことは、
30より大きいものを抽出したい
ただそれだけです。
■ LINQで書くとどうなる?
同じ処理をLINQで書くとこうなります。
using System.Linq;
int[] numbers = { 10, 20, 30, 40, 50, 60 };
var result = numbers.Where(n => n > 30);
foreach (var n in result)
{
Console.WriteLine(n);
}
■ Whereって何?
numbers.Where(n => n > 30)
意味は:
n が 30より大きいものだけ残してください
です。
for文では
- 回して
- 比較して
- 条件分岐して
と書いていました。
LINQでは
条件だけを書く
のです。
■ ラムダ式を怖がらなくていい
ここで出てくる
n => n > 30
これがいわゆる「ラムダ式」です。
でも難しく考える必要はありません。
これは、
「n が 30より大きいかどうかを調べるルール」
を書いているだけです。
■ 記号の意味をシンプルに
n
→ 1つ取り出した数字
=>
→ 「ならば」「だったら」
n > 30
→ 30より大きい?
つまり、
n => n > 30
は、
「1つ取り出した数字が30より大きいならOK」
という意味です。
■ for文と比べると?
これまで書いていたのは:
if (numbers[i] > 30)
LINQではそれを短くしているだけです。
仕組みの深い話(デリゲートなど)は、
今は理解しなくて大丈夫です。
今は、
条件を書くための短い書き方
と思ってください。
■ for文とLINQの違い
for文
- 「どう回すか」を書く
- 手続き的
- インデックスが必要
LINQ
- 「何を取りたいか」を書く
- 宣言的
- 回し方は自動
■ 設計レベルが一段上がる
これは単なる書き方の違いではありません。
思考が変わります。
これまで
1個ずつ見て…
LINQ
条件に合うものをください
コードが「意図」に近づきます。
■ Unityや実務ではどうなる?
例えば:
var deadEnemies = enemies.Where(e => e.HP <= 0);
これは
HPが0以下の敵だけ取得
という意味です。
データが増えるほど、LINQの価値は上がります。
■ 今日のまとめ
今回の問題は、
LINQへ進むための土台
でした。
for文は「作業の書き方」
LINQは「意図の書き方」
そしてラムダ式は、
条件を書くためのシンプルなルール
です。
怖がる必要はありません。
まずは
- Whereを使えるようになること
- 条件を素直に書けること
ここから一歩ずつ進みましょう。





ディスカッション
コメント一覧
まだ、コメントがありません