Day 56 のゴールと全体像
Day 56 では、C# の世界をぐっと“気持ちよく”してくれる機能、LINQ(リンク)を扱います。 今日のテーマは次の3つです。
- LINQとは
- Where
- Select
配列やリストを扱うとき、 「毎回 foreach と if でゴリゴリ書いていて、ちょっとしんどいな…」と感じたことがある方も多いと思います。 LINQは、そんな場面をすっきりと、そして少し楽しくしてくれる存在です。
ここでは、初心者の方でも迷子にならないように、 ステップバイステップで丁寧に解説していきます。
LINQとは
コレクションに対する「問い合わせ」をコードで書く仕組み
LINQ は Language Integrated Query の略で、 「言語に統合された問い合わせ機能」という意味を持ちます。
ざっくり言うと、
配列やリストなどの“データの集まり”に対して、 SQL のような“問い合わせ”を、C# のコードで自然に書ける仕組み
だと思っていただくとイメージしやすいです。
従来の書き方と LINQ の違い
例えば「10より大きい数字だけ取り出したい」という処理を考えてみます。
従来の書き方(foreach)
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var numbers = new List<int> { 5, 12, 3, 18, 7 };
var result = new List<int>();
// 1つずつ取り出して条件をチェック
foreach (var n in numbers)
{
if (n > 10)
{
result.Add(n); // 条件を満たしたものだけ追加
}
}
foreach (var n in result)
{
Console.WriteLine(n);
}
}
}
C#LINQ を使った書き方
using System;
using System.Collections.Generic;
using System.Linq; // LINQ を使うために必要
class Program
{
static void Main()
{
var numbers = new List<int> { 5, 12, 3, 18, 7 };
// 条件に合うものだけを抽出
var result = numbers.Where(n => n > 10);
foreach (var n in result)
{
Console.WriteLine(n);
}
}
}
C#同じことをしているのに、 LINQ のほうが「何をしたいのか」がストレートに伝わってきます。
Where(n => n > 10)→ 「n が 10 より大きいものだけ欲しい」
という“意図”が、そのままコードになっている感じですね。
Where で絞り込む
Where の役割
Where は LINQ の中でも、最もよく使われるメソッドのひとつです。 役割はとてもシンプルで、
条件に合う要素だけを取り出す
というフィルターのような働きをします。
基本形のテンプレート
コレクション.Where(x => 条件)
C#コレクション:配列、リストなどx:1つずつ取り出される要素条件:xに対して true / false を返す式
例1:偶数だけ取り出す
using System;
using System.Linq; // LINQ を使うために必要
class Program
{
static void Main()
{
var numbers = new[] { 1, 2, 3, 4, 5, 6 };
// 偶数だけを抽出する
var evenNumbers = numbers.Where(x => x % 2 == 0);
Console.WriteLine("偶数の一覧:");
foreach (var n in evenNumbers)
{
Console.WriteLine(n);
}
}
}
C#コードのポイント
x => x % 2 == 0は「x を受け取って、x が偶数かどうかを返す関数」です。Whereは「その関数を使って、true になるものだけを残す」メソッドです。
例2:文字列の長さで絞り込む
using System;
using System.Linq;
class Program
{
static void Main()
{
var names = new[] { "山田", "佐藤花子", "鈴木一郎", "田中" };
// 3文字以上の名前だけを抽出
var longNames = names.Where(name => name.Length >= 3);
Console.WriteLine("3文字以上の名前:");
foreach (var name in longNames)
{
Console.WriteLine(name);
}
}
}
C#コードのポイント
name => name.Length >= 3という条件で、 「文字数が3以上かどうか」をチェックしています。- 数値だけでなく、文字列やオブジェクトにも自由に条件をかけられるのが LINQ の魅力です。
Select で変換する
Select の役割
Select は、データを“別の形に変換する”ためのメソッドです。
元の要素を受け取って、 「こういう形にしたい」という変換結果を返す
というイメージです。
基本形のテンプレート
コレクション.Select(x => 変換後の値)
C#x:元の要素変換後の値:新しく作りたい値
例1:数字を2倍にして取り出す
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 1, 2, 3, 4 };
// 数字を2倍に変換
var doubled = numbers.Select(x => x * 2);
Console.WriteLine("2倍にした結果:");
foreach (var n in doubled)
{
Console.WriteLine(n);
}
}
}
C#コードのポイント
x => x * 2は「x を受け取って、x * 2 を返す関数」です。Selectは「その関数を使って、すべての要素を変換する」メソッドです。
例2:文字列を「表示用のメッセージ」に変換する
using System;
using System.Linq;
class Program
{
static void Main()
{
var names = new[] { "山田", "佐藤", "鈴木" };
// 名前を「こんにちは、○○さん」というメッセージに変換
var messages = names.Select(name => $"こんにちは、{name}さん");
foreach (var msg in messages)
{
Console.WriteLine(msg);
}
}
}
C#コードのポイント
name => $"こんにちは、{name}さん"というラムダ式で、 「名前」から「挨拶メッセージ」を作っています。Selectは「元のデータを、別の意味を持つデータに変換する」場面でとても便利です。
Where と Select を組み合わせる
LINQ の真価は「つなげて使う」ことにある
LINQ は、メソッドをつなげて使うことで、 複雑な処理を驚くほど読みやすくできます。
例:10より大きい数字を2倍にして取り出す
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 5, 12, 3, 18, 7 };
var result = numbers
.Where(n => n > 10) // 10より大きいものだけ
.Select(n => n * 2); // それを2倍にする
Console.WriteLine("10より大きい数字を2倍にした結果:");
foreach (var n in result)
{
Console.WriteLine(n);
}
}
}
C#コードの読み方
Where(n => n > 10)→ 「まず、10より大きいものだけを残す」Select(n => n * 2)→ 「残ったものを2倍にする」
このように、
絞り込み → 変換
という流れが、コードの形そのままに表現されています。 “処理のストーリー”がそのままコードになっている感じで、 読んでいて気持ちがいいですよね。
オブジェクトに対して LINQ を使う
クラスの一覧に対して Where / Select を使う
LINQ の本領は、 単なる数字や文字列だけでなく、 オブジェクトの一覧に対して使ったときに発揮されます。
例:ユーザー一覧から「大人だけの名前」を取り出す
using System;
using System.Linq;
using System.Collections.Generic;
// ユーザー情報を表すクラス
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 },
new User { Name = "鈴木一郎", Age = 30 }
};
// 20歳以上のユーザーだけを抽出し、その名前だけを取り出す
var adultNames = users
.Where(u => u.Age >= 20) // 年齢で絞り込み
.Select(u => u.Name); // 名前だけに変換
Console.WriteLine("20歳以上のユーザーの名前:");
foreach (var name in adultNames)
{
Console.WriteLine(name);
}
}
}
C#コードのポイント
Where(u => u.Age >= 20)で、「User の Age プロパティ」を条件にしています。Select(u => u.Name)で、「User から Name だけを取り出す」変換をしています。- LINQ は「オブジェクトのプロパティを使った絞り込み・変換」にとても相性が良いです。
LINQ入門の基本テンプレート
最後に、初心者の方がまず覚えておくと便利な「LINQ入門テンプレート」をまとめておきます。
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// 1. Where:条件で絞り込む
var evenNumbers = numbers.Where(x => x % 2 == 0); // 偶数だけ
// 2. Select:変換する
var doubledNumbers = numbers.Select(x => x * 2); // 2倍にする
// 3. 組み合わせ:3より大きい数字を2倍にして文字列にする
var messages = numbers
.Where(x => x > 3)
.Select(x => $"値は {x * 2} です");
Console.WriteLine("偶数:");
foreach (var n in evenNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine("2倍:");
foreach (var n in doubledNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine("メッセージ:");
foreach (var msg in messages)
{
Console.WriteLine(msg);
}
}
}
C#このテンプレートをベースに、
- 条件を変えてみる
- 変換内容を変えてみる
- オブジェクトの一覧に対して使ってみる
といった小さな工夫を重ねていくと、 LINQ の感覚が少しずつ手に馴染んでいきます。
Day 56 のまとめ
Day 56 では、
- LINQ が「コレクションに対する問い合わせを、読みやすく書くための仕組み」であること
Whereが「条件で絞り込む」ためのメソッドであることSelectが「別の形に変換する」ためのメソッドであることWhereとSelectを組み合わせることで、 「絞り込み → 変換」という流れを、コードの形そのままに表現できること
を、具体的なコード例とともに学びました。
LINQ を使い始めると、
- コレクション操作が短く、読みやすくなる
- 意図がコードにそのまま乗るようになる
- データ処理が少し楽しく感じられる
そんな変化が、少しずつ実感できるはずです。
ぜひ、
- 自分で配列やリストを用意して、条件や変換をいろいろ試してみる
- オブジェクトの一覧に対して、
WhereとSelectを使ってみる
といった小さな一歩を重ねながら、 LINQ の心地よさを、自分の手で確かめていっていただければうれしいです。
