LINQの次の一歩(Selectとは何か?)
― データを「加工する」という考え方 ―
前回は、
numbers.Where(n => n > 30);
で「条件に合うものを抽出」しました。
で
条件に合うものを抽出する
という処理を学びました。
Whereは
フィルター(ふるい)
でしたね。
今日はその次の段階です。
■ Selectとは?
Selectは、
データを「別の形」に変える
ためのものです。
Whereは「残す」
Selectは「変える」
ここが最大の違いです。
■ 例1:数値を2倍にする
using System.Linq;
int[] numbers = { 10, 20, 30 };
var doubled = numbers.Select(n => n * 2);
foreach (var n in doubled)
{
Console.WriteLine(n);
}
出力:
20
40
60
■ 何が起きている?
n => n * 2
これは
n を 2倍にするルール
です。
Selectは
1つずつ取り出して、別の値に変える
処理をしています。
■ WhereとSelectの違い(重要)
| メソッド | 役割 | 戻る型 |
|---|---|---|
| Where | 条件に合うものだけ残す | 元の型 |
| Select | データを別の形に変える | 新しい型 |
ここを曖昧にすると混乱します。
Selectは「抽出」ではなく
変換
です。
■ 実務やUnityでは?
例えばプレイヤーがいるとします。
class Player
{
public string Name;
public int HP;
}
■ HPだけを数値として取得したい場合
using System;
using System.Collections.Generic;
using System.Linq;
class Player
{
public string Name;
public int HP;
}
class Program
{
static void Main()
{
List<Player> players = new List<Player>
{
new Player { Name = "勇者", HP = 120 },
new Player { Name = "戦士", HP = 150 },
new Player { Name = "魔法使い", HP = 80 }
};
var hpList = players.Select(p => p.HP);
Console.WriteLine("=== HP一覧 ===");
foreach (var hp in hpList)
{
Console.WriteLine(hp);
}
}
}
出力:
=== HP一覧 ===
120
150
80
■ ここで大事な整理
var hpList = players.Select(p => p.HP);
これは List ではありません。
「まだ確定していないデータの流れ」です。
WhereとSelectでは、戻ってくる型が違います
List<Player> filtered = players.Where(p => p.HP > 100);
IEnumerable<int> hpList = players.Select(p => p.HP);
これは
Player を int(HP)に変換している
のです。
Whereのように「人数を減らしている」のではありません。
型が変わっています。
■ Whereと組み合わせる
強いプレイヤーの名前だけ表示したい:
var strongNames = players
.Where(p => p.HP > 100)
.Select(p => p.Name);
読んでみましょう。
HPが100より大きいプレイヤーを選び
そのプレイヤーを名前(string)に変換する
かなり自然な文章に近いですね。
■ ここで大事なこと
Selectもラムダ式を使います。
p => p.Name
意味は
p を Name に変換する
だけです。
今は
- デリゲート
- Func
- 内部構造
を理解する必要はありません。
「変換のルールを書いている」と思えば十分です。
■ 思考が変わる瞬間
for文では:
- 回して
- 条件分岐して
- 新しいリストを作って
- Addして
と書いていました。
LINQでは:
欲しい形を書く
だけです。
■ 今日のまとめ
LINQの基本は2つ。
- Where = 抽出(ふるい)
- Select = 変換(形を変える)
この2つを理解すると、
- ゲーム開発
- データ処理
- 実務アプリ開発
すべてが一段レベルアップします。



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