12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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地獄脱出編 も書きます。

12
10
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?