はじめに
C#書いてるなら必ず通る LINQ(リンク)。
でも最初は
- 使い方が多すぎる
- メソッド名が覚えられない
- どれ使えばいいかわからん
という人が多い。
この記事は、LINQで最低限覚えておけば現場で困らない全体マップをまとめます。
全部実コード例つき。コピペで実戦投入できます。
そもそもLINQとは?
**LINQ(Language Integrated Query)**は、C#に組み込まれた「コレクションやデータを簡潔・直感的に操作できる仕組み」です。
SQLに似た感覚で:
- データの抽出(フィルター)
- 並び替え(ソート)
- 集約(合計・平均など)
- グループ化
- 結合
- 射影(必要な項目だけ取り出す)
を、配列・リスト・DB・XMLなどあらゆるデータに対して統一的に記述できます。
現場でLINQを使うシーンは:
- List や IEnumerable のデータ加工
- 集計や統計処理
- 絞り込みやフィルター
- データの成形・変換
- DBの抽出ロジック(Entity Framework等と連携)
→ "foreach地獄" をLINQで一気にスマートに置き換える感覚です。
サンプルデータ
まずは元データ例を想定:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Department { get; set; }
}
var users = new List<User>
{
new User { Id = 1, Name = "Alice", Age = 24, Department = "Sales" },
new User { Id = 2, Name = "Bob", Age = 32, Department = "HR" },
new User { Id = 3, Name = "Charlie", Age = 28, Department = "Sales" },
new User { Id = 4, Name = "Diana", Age = 45, Department = "IT" },
new User { Id = 5, Name = "Eve", Age = 30, Department = "IT" },
};
① フィルター系
Where(条件抽出)
var adults = users.Where(u => u.Age >= 30).ToList();
結果:
[
{ Id = 2, Name = "Bob", Age = 32, Department = "HR" },
{ Id = 4, Name = "Diana", Age = 45, Department = "IT" },
{ Id = 5, Name = "Eve", Age = 30, Department = "IT" }
]
OfType(型フィルター)
var strings = list.OfType<string>();
② 変換・射影系
Select(項目変換)
var names = users.Select(u => u.Name).ToList();
結果:
[ "Alice", "Bob", "Charlie", "Diana", "Eve" ]
SelectMany(多段展開)
// 例として各ユーザーに複数のタグがある場合
var allTags = users.SelectMany(u => u.Tags).ToList();
③ ソート系
OrderBy / ThenBy
var sorted = users.OrderBy(u => u.Age).ThenBy(u => u.Name).ToList();
結果:
[
{ Name = "Alice", Age = 24 },
{ Name = "Charlie", Age = 28 },
{ Name = "Eve", Age = 30 },
{ Name = "Bob", Age = 32 },
{ Name = "Diana", Age = 45 }
]
④ 集約・統計系
Count
int count = users.Count();
結果: 5
Sum / Average / Min / Max
var avgAge = users.Average(u => u.Age);
結果: 31.8
⑤ グループ化系
GroupBy
var grouped = users.GroupBy(u => u.Department);
結果(イメージ):
Sales: [ Alice, Charlie ]
HR: [ Bob ]
IT: [ Diana, Eve ]
⑥ 判定系
Any / All
bool hasSenior = users.Any(u => u.Age > 40);
結果: true
⑦ 先頭・部分抽出系
First / FirstOrDefault
var firstUser = users.FirstOrDefault();
結果: { Id = 1, Name = "Alice", Age = 24, Department = "Sales" }
Take / Skip
var page = users.Skip(2).Take(2).ToList();
結果:
[
{ Id = 3, Name = "Charlie", Age = 28 },
{ Id = 4, Name = "Diana", Age = 45 }
]
⑧ 重複・集合系
Distinct
var distinctDepartments = users.Select(u => u.Department).Distinct().ToList();
結果:
[ "Sales", "HR", "IT" ]
⑨ 結合系
Join(内部結合)
var result = orders.Join(customers, o => o.CustomerId, c => c.Id, (o, c) => new { o.OrderId, c.Name });
おわりに
LINQは**覚えゲーではなく「型とパターンで整理するもの」**です。
実は現場の8〜9割はこの記事の内容で事足ります。
もし「LINQで詰まるあるある」あったらコメントで教えてください。
別記事で LINQ地獄脱出編 も書きます。