C# の LINQ はコレクションや配列を効率的に操作するための強力な仕組みです。基本的な Where
や Select
に加えて、GroupBy
・OrderBy
・Join
を使いこなすことで、データ集計や並べ替え、複数データの結合が簡単に行えます。本記事ではこれらの応用的な使い方を解説します。
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# プログラムの表現力と生産性が格段に向上します。