本文へスキップ
BecomeCoder

C#文法コース · 第5章 LINQ · レッスン43

実務で効くLINQ

ブラウザで完結

導入

基本のWhere/Select/集計に加え、実務では「先頭10件だけ」「重複を消す」「ネストを平らにする」「一発で辞書にする」といった操作が頻出します。ここでは現場で特に使う便利メソッドと、SQLに似たクエリ構文をまとめて押さえます。

図解

flowchart TB
    D["元データ"] --> SK["Skip / Take<br/>ページング"]
    D --> DI["Distinct<br/>重複除去"]
    D --> SM["SelectMany<br/>入れ子を平らに"]
    D --> TD["ToDictionary<br/>キー→値の辞書化"]
    D --> AG["Aggregate<br/>畳み込み"]

サンプル

int[] nums = { 5, 3, 8, 3, 9, 1, 8 };

// Skip / Take: ページング(3件飛ばして2件)
foreach (int n in nums.Skip(3).Take(2))
    Console.Write($"{n} ");            // 9 1
Console.WriteLine();

// Distinct: 重複を除く
Console.WriteLine(string.Join(",", nums.Distinct()));   // 5,3,8,9,1

// OrderByで並べ替え → Takeで上位(トップ3)
Console.WriteLine(string.Join(",", nums.OrderByDescending(x => x).Take(3)));  // 9,8,8

// SelectMany: 入れ子のコレクションを1本に平らにする
string[] csv = { "a,b", "c,d" };
Console.WriteLine(string.Join(",", csv.SelectMany(s => s.Split(','))));   // a,b,c,d

// ToDictionary: キーと値を決めて辞書化
string[] words = { "cat", "tiger", "ox" };
var byLength = words.ToDictionary(w => w, w => w.Length);
Console.WriteLine(byLength["tiger"]);   // 5

// Aggregate: 要素を1つずつ畳み込む(ここでは総乗)
int product = new[] { 1, 2, 3, 4 }.Aggregate((acc, x) => acc * x);
Console.WriteLine(product);             // 24

// クエリ構文(SQLに似た書き方。メソッド構文と同じ意味)
var evens =
    from n in nums
    where n % 2 == 0
    orderby n
    select n;
Console.WriteLine(string.Join(",", evens));   // 8,8
  • Skip/Takeでページング、Distinctで重複除去、SelectManyで入れ子を平坦化
  • ToDictionaryで一発辞書化、Aggregateで「畳み込み(合計や総乗などの一般化)」
  • クエリ構文from ... where ... select)はメソッド構文と同じ処理をSQL風に書ける書き方

演習

int[] scores = { 40, 90, 75, 60, 88, 30 };

// TODO: 60点以上だけを取り出し、降順に並べ、上位2件をカンマ区切りで出力してください("90,88")
___
  • 期待される出力: 90,88
ヒント1を見る

Where(s => s >= 60)OrderByDescending(s => s)Take(2) をつなぎ、string.Join(",", ...)で連結します

ヒント2を見る

Console.WriteLine(string.Join(",", scores.Where(s => s >= 60).OrderByDescending(s => s).Take(2)));

まとめ

  • Skip/Take(ページング)・Distinct(重複除去)・SelectMany(平坦化)・ToDictionary(辞書化)・Aggregate(畳み込み)が実務頻出
  • メソッドは.でいくつでもつなげられる(メソッドチェーン)
  • SQL風に書くクエリ構文も同じ結果になる

次章: プログラムのエラーに備える「例外処理null安全」へ進みます。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。