【永久保存版】C#エンジニアのための "これだけ見ればなんとかなるLINQ総集編"

## はじめに

C#書いてるなら必ず通る **LINQ（リンク）**。
でも最初は

* 使い方が多すぎる
* メソッド名が覚えられない
* どれ使えばいいかわからん
  という人が多い。

この記事は、**LINQで最低限覚えておけば現場で困らない全体マップ**をまとめます。
全部実コード例つき。コピペで実戦投入できます。

---

## そもそもLINQとは？

\*\*LINQ（Language Integrated Query）\*\*は、C#に組み込まれた「コレクションやデータを簡潔・直感的に操作できる仕組み」です。

SQLに似た感覚で：

* データの抽出（フィルター）
* 並び替え（ソート）
* 集約（合計・平均など）
* グループ化
* 結合
* 射影（必要な項目だけ取り出す）

を、**配列・リスト・DB・XMLなどあらゆるデータに対して統一的に記述**できます。

現場でLINQを使うシーンは：

* List<T> や IEnumerable<T> のデータ加工
* 集計や統計処理
* 絞り込みやフィルター
* データの成形・変換
* DBの抽出ロジック（Entity Framework等と連携）

**→ "foreach地獄" をLINQで一気にスマートに置き換える感覚です。**

---

## サンプルデータ

まずは元データ例を想定：

```csharp
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（条件抽出）

```csharp
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（型フィルター）

```csharp
var strings = list.OfType<string>();
```

---

## ② 変換・射影系

### Select（項目変換）

```csharp
var names = users.Select(u => u.Name).ToList();
```

**結果:**

```
[ "Alice", "Bob", "Charlie", "Diana", "Eve" ]
```

### SelectMany（多段展開）

```csharp
// 例として各ユーザーに複数のタグがある場合
var allTags = users.SelectMany(u => u.Tags).ToList();
```

---

## ③ ソート系

### OrderBy / ThenBy

```csharp
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

```csharp
int count = users.Count();
```

**結果:** `5`

### Sum / Average / Min / Max

```csharp
var avgAge = users.Average(u => u.Age);
```

**結果:** `31.8`

---

## ⑤ グループ化系

### GroupBy

```csharp
var grouped = users.GroupBy(u => u.Department);
```

**結果（イメージ）:**

```
Sales: [ Alice, Charlie ]
HR: [ Bob ]
IT: [ Diana, Eve ]
```

---

## ⑥ 判定系

### Any / All

```csharp
bool hasSenior = users.Any(u => u.Age > 40);
```

**結果:** `true`

---

## ⑦ 先頭・部分抽出系

### First / FirstOrDefault

```csharp
var firstUser = users.FirstOrDefault();
```

**結果:** `{ Id = 1, Name = "Alice", Age = 24, Department = "Sales" }`

### Take / Skip

```csharp
var page = users.Skip(2).Take(2).ToList();
```

**結果:**

```
[
  { Id = 3, Name = "Charlie", Age = 28 },
  { Id = 4, Name = "Diana", Age = 45 }
]
```

---

## ⑧ 重複・集合系

### Distinct

```csharp
var distinctDepartments = users.Select(u => u.Department).Distinct().ToList();
```

**結果:**

```
[ "Sales", "HR", "IT" ]
```

---

## ⑨ 結合系

### Join（内部結合）

```csharp
var result = orders.Join(customers, o => o.CustomerId, c => c.Id, (o, c) => new { o.OrderId, c.Name });
```

---

## おわりに

LINQは\*\*覚えゲーではなく「型とパターンで整理するもの」\*\*です。
実は現場の8〜9割はこの記事の内容で事足ります。

もし「LINQで詰まるあるある」あったらコメントで教えてください。
別記事で **LINQ地獄脱出編** も書きます。