【C#】LINQの応用|GroupBy・OrderBy・Joinの使い方

C# の LINQ はコレクションや配列を効率的に操作するための強力な仕組みです。基本的な WhereSelect に加えて、GroupByOrderByJoin を使いこなすことで、データ集計や並べ替え、複数データの結合が簡単に行えます。本記事ではこれらの応用的な使い方を解説します。

GroupBy|データをグループ化する

GroupBy は特定のキーを基準にデータをまとめるときに使います。SQL の GROUP BY と同じイメージです。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        var people = new List<(string Name, string City)>
        {
            ("Taro", "Tokyo"),
            ("Hanako", "Osaka"),
            ("Jiro", "Tokyo"),
            ("Mika", "Osaka"),
            ("Ken", "Nagoya")
        };

        var groups = people.GroupBy(p => p.City);

        foreach (var group in groups)
        {
            Console.WriteLine($"City: {group.Key}");
            foreach (var person in group)
            {
                Console.WriteLine($"  {person.Name}");
            }
        }
    }
}

この例では「Tokyo」「Osaka」「Nagoya」ごとに人がグループ化されて出力されます。

OrderBy|データを並べ替える

OrderBy は昇順に並べ替え、OrderByDescending は降順に並べ替えます。

var numbers = new[] { 5, 3, 8, 1, 4 };

var asc = numbers.OrderBy(n => n);
var desc = numbers.OrderByDescending(n => n);

Console.WriteLine("昇順: " + string.Join(", ", asc));   // 1, 3, 4, 5, 8
Console.WriteLine("降順: " + string.Join(", ", desc)); // 8, 5, 4, 3, 1

オブジェクトのプロパティを基準にソートすることも可能です。

var people = new[]
{
    new { Name = "Taro", Age = 25 },
    new { Name = "Hanako", Age = 20 },
    new { Name = "Jiro", Age = 30 }
};

var ordered = people.OrderBy(p => p.Age);

foreach (var person in ordered)
{
    Console.WriteLine($"{person.Name} ({person.Age})");
}
// Hanako (20), Taro (25), Jiro (30)

Join|複数のデータを結合する

Join は異なるコレクションをキーで結合します。SQL の INNER JOIN と同じように使えます。

var students = new[]
{
    new { Id = 1, Name = "Taro" },
    new { Id = 2, Name = "Hanako" },
    new { Id = 3, Name = "Jiro" }
};

var scores = new[]
{
    new { StudentId = 1, Score = 80 },
    new { StudentId = 2, Score = 90 },
    new { StudentId = 3, Score = 70 }
};

var result = students.Join(
    scores,
    s => s.Id,            // 学生の Id
    sc => sc.StudentId,   // スコアの StudentId
    (s, sc) => new { s.Name, sc.Score } // 結合結果
);

foreach (var r in result)
{
    Console.WriteLine($"{r.Name}: {r.Score}");
}
// Taro: 80
// Hanako: 90
// Jiro: 70

まとめ

LINQ の応用的な操作を整理すると次のようになります。

  • GroupBy … 特定のキーでデータをグループ化
  • OrderBy / OrderByDescending … 並べ替え
  • Join … 複数コレクションの結合

これらを組み合わせることで、データ処理を簡潔かつ直感的に記述できます。LINQ を使いこなすことで、C# プログラムの表現力と生産性が格段に向上します。