C# における Lambda 式と LINQ クエリに関する完全かつ包括的な記事を以下に記述します。
Lambda 式とは
Lambda 式は、C# における匿名メソッド(名前のないメソッド)を簡潔に記述するための構文です。関数型プログラミングのスタイルを取り入れたこの機能は、コードをより簡潔に、そして柔軟にします。
Lambda 式は、通常のメソッドと同様に引数を受け取ることができますが、その構文は非常にシンプルで、メソッド名やボディを省略できます。基本的な構文は次のようになります:
csharp(parameters) => expression
例えば、二つの整数を足す Lambda 式は次のように書けます:
csharpFunc<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(3, 5)); // 出力: 8
ここで、Func は引数として二つの整数を受け取り、整数を返す関数のデリゲート型です。(x, y) => x + y が Lambda 式です。
Lambda 式は、特に LINQ クエリの中でよく使用されます。LINQ とは、Language Integrated Query の略で、データソースに対してクエリを記述するための機能です。次のセクションでは LINQ と Lambda 式がどのように連携するのかを解説します。
LINQ クエリとは
LINQ(Language Integrated Query)は、C# などの .NET 言語において、データソース(コレクションやデータベースなど)に対してクエリを記述するための統一的な方法を提供します。LINQ は、SQL に似た構文を使用し、データをフィルタリング、並べ替え、集計するなどの操作を簡単に実行できるようにします。
LINQ には二つの主要な記述方法があります:メソッド構文とクエリ構文です。
LINQ メソッド構文
LINQ メソッド構文は、データソースに対してメソッドをチェーンする形でクエリを記述します。多くの場合、これに Lambda 式を組み合わせて使用します。
例えば、以下のコードでは、整数のリストから 10 より大きい数をフィルタリングし、それを昇順に並べ替えています:
csharpList<int> numbers = new List<int> { 5, 10, 15, 20, 25, 30 };
var result = numbers.Where(x => x > 10).OrderBy(x => x);
foreach (var number in result)
{
Console.WriteLine(number); // 出力: 15, 20, 25, 30
}
このコードの中で使用している Where や OrderBy は LINQ メソッドであり、x => x > 10 や x => x は Lambda 式です。
-
Whereメソッドは、条件に合致する要素のみをフィルタリングします。 -
OrderByメソッドは、結果を指定された条件で並べ替えます。
LINQ クエリ構文
クエリ構文は、SQL に似た構文でクエリを記述します。Lambda 式と同じく、簡潔なコードが特徴です。例えば、以下のコードでは、整数のリストから 10 より大きい数をフィルタリングし、それを昇順に並べ替えています:
csharpvar result = from number in numbers
where number > 10
orderby number
select number;
foreach (var number in result)
{
Console.WriteLine(number); // 出力: 15, 20, 25, 30
}
クエリ構文も非常に直感的で、from、where、orderby、select を使ってデータを操作します。しかし、メソッド構文の方が柔軟性が高いため、複雑な操作が必要な場合にはメソッド構文を選択することが多いです。
LINQ と Lambda 式の活用例
LINQ と Lambda 式は非常に強力なツールであり、複雑なデータ操作を簡潔に記述することができます。以下にいくつかの活用例を示します。
1. フィルタリングと並べ替え
リストから特定の条件に基づいて要素をフィルタリングし、並べ替える例です:
csharpList<int> numbers = new List<int> { 5, 10, 15, 20, 25, 30 };
var result = numbers.Where(x => x > 10)
.OrderByDescending(x => x);
foreach (var number in result)
{
Console.WriteLine(number); // 出力: 30, 25, 20, 15
}
2. 集計操作
数値リストから合計や平均を計算する方法です:
csharpList<int> numbers = new List<int> { 5, 10, 15, 20, 25, 30 };
int sum = numbers.Sum(x => x);
double average = numbers.Average(x => x);
Console.WriteLine($"合計: {sum}"); // 出力: 合計: 105
Console.WriteLine($"平均: {average}"); // 出力: 平均: 17.5
3. グループ化
データをグループ化し、各グループごとの集計を行う方法です:
csharpvar people = new List<(string Name, int Age)>
{
("佐藤", 25),
("鈴木", 30),
("高橋", 25),
("田中", 30),
("山本", 40)
};
var grouped = people.GroupBy(p => p.Age);
foreach (var group in grouped)
{
Console.WriteLine($"{group.Key} 歳:");
foreach (var person in group)
{
Console.WriteLine($" {person.Name}");
}
}
このコードでは、GroupBy メソッドを使って年齢ごとにグループ化しています。出力は次のようになります:
25 歳: 佐藤 高橋 30 歳: 鈴木 田中 40 歳: 山本
まとめ
C# の Lambda 式と LINQ クエリは、データ操作を効率的かつ直感的に行うための強力なツールです。Lambda 式は関数型プログラミングスタイルでコードを簡潔に記述でき、LINQ はその上でデータを操作するための豊富なメソッド群を提供します。
これらのツールを活用することで、特にコレクションの操作やデータベースからのデータ取得において、コードの可読性と生産性を大きく向上させることができます。
