導入
基本の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風に書くクエリ構文も同じ結果になる