C#のLINQとラムダ式を組み合わせた便利な活用例!初心者向け完全ガイド
生徒
「先生、LINQとラムダ式を組み合わせると、もっと便利になるって聞いたんですけど、本当ですか?」
先生
「その通りです。LINQとラムダ式を組み合わせることで、データの絞り込みや加工がとても簡潔に書けるようになります。」
生徒
「具体的にはどんな場面で使えるんですか?」
先生
「それでは、実際のコード例を見ながら、便利な活用方法を学んでいきましょう!」
1. LINQとラムダ式の組み合わせとは?
C#のLINQ(Language Integrated Query)とは、データベースのようにコレクションを検索したり、並べ替えたりできる機能です。そしてラムダ式は、処理を短く書くための特別な書き方のことです。この二つを組み合わせると、データの操作がとても簡単になります。
例えば、たくさんの商品の中から「値段が千円以下のもの」だけを探したり、「名前順に並べ替える」といった作業が、たった数行のコードで実現できます。プログラミング未経験の方でも、慣れればとても便利に使えるようになります。
2. データの絞り込み(Where)を使った活用例
Whereメソッドは、条件に合うデータだけを取り出すときに使います。ラムダ式と組み合わせることで、条件を簡潔に記述できます。
基本的な絞り込みの例
次のコードは、数値のリストから偶数だけを取り出す例です。
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
}
}
実行結果:
2
4
6
8
10
ここでn => n % 2 == 0という部分がラムダ式です。nはリストの各要素を表し、n % 2 == 0は「nを2で割った余りが0」という条件です。つまり、偶数かどうかを判定しています。
3. データの並べ替え(OrderBy・OrderByDescending)
OrderByメソッドは、データを昇順(小さい順)に並べ替えます。逆にOrderByDescendingは降順(大きい順)に並べ替えます。
文字列を並べ替える例
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> fruits = new List<string> { "りんご", "バナナ", "みかん", "ぶどう" };
var sortedFruits = fruits.OrderBy(f => f);
foreach (var fruit in sortedFruits)
{
Console.WriteLine(fruit);
}
}
}
実行結果:
バナナ
ぶどう
みかん
りんご
ラムダ式f => fは「各要素をそのまま使う」という意味です。これにより、文字列が五十音順に並べ替えられます。
4. データの変換(Select)
Selectメソッドは、各要素を別の形に変換するときに使います。例えば、数値のリストを二倍にしたり、文字列の長さを取得したりできます。
数値を二倍にする例
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var doubledNumbers = numbers.Select(n => n * 2);
foreach (var num in doubledNumbers)
{
Console.WriteLine(num);
}
}
}
実行結果:
2
4
6
8
10
ラムダ式n => n * 2により、各要素が二倍に変換されています。元のリストは変更されず、新しいリストが作成される点に注意してください。
5. 複数の条件を組み合わせた活用例
LINQのメソッドは連続して使うことができます。これをメソッドチェーンと呼びます。複数の条件を組み合わせることで、より高度なデータ処理が可能になります。
複数条件での絞り込みと並べ替え
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 15, 8, 21, 3, 12, 6, 30, 18 };
var result = numbers
.Where(n => n >= 10)
.Where(n => n % 3 == 0)
.OrderBy(n => n);
foreach (var num in result)
{
Console.WriteLine(num);
}
}
}
実行結果:
12
15
18
21
30
このコードでは、まず10以上の数値を絞り込み、次に3で割り切れる数値だけを選択し、最後に小さい順に並べ替えています。このように、複数の処理を繋げて書くことができます。
6. 集計処理(Count・Sum・Average)
LINQには、データの個数を数えたり、合計や平均を計算したりする便利なメソッドがあります。
条件に合うデータの個数を数える例
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> scores = new List<int> { 85, 92, 76, 88, 95, 81, 90 };
int highScoreCount = scores.Count(s => s >= 90);
double average = scores.Average();
int total = scores.Sum();
Console.WriteLine($"90点以上の人数: {highScoreCount}人");
Console.WriteLine($"平均点: {average}点");
Console.WriteLine($"合計点: {total}点");
}
}
実行結果:
90点以上の人数: 3人
平均点: 86.71428571428571点
合計点: 607点
Countメソッドにラムダ式を渡すと、条件に合う要素だけを数えることができます。AverageやSumは、全体の平均値や合計値を簡単に計算できる便利なメソッドです。
7. クラスのリストを扱う実践的な例
実際のプログラムでは、クラスで定義したオブジェクトのリストを扱うことが多いです。ここでは商品クラスを使った例を見てみましょう。
商品リストの操作例
using System;
using System.Linq;
using System.Collections.Generic;
class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
class Program
{
static void Main()
{
List<Product> products = new List<Product>
{
new Product { Name = "ノート", Price = 150 },
new Product { Name = "ペン", Price = 100 },
new Product { Name = "消しゴム", Price = 80 },
new Product { Name = "定規", Price = 200 },
new Product { Name = "クリップ", Price = 50 }
};
var cheapProducts = products
.Where(p => p.Price <= 100)
.OrderBy(p => p.Price);
Console.WriteLine("100円以下の商品:");
foreach (var product in cheapProducts)
{
Console.WriteLine($"{product.Name}: {product.Price}円");
}
}
}
実行結果:
100円以下の商品:
クリップ: 50円
消しゴム: 80円
ペン: 100円
このように、クラスのプロパティを使った条件指定もラムダ式で簡潔に書けます。p => p.Price <= 100は「商品の価格が100円以下」という条件を表しています。
8. 最初や最後の要素を取得(First・Last)
Firstメソッドは最初の要素を、Lastメソッドは最後の要素を取得します。条件を指定することもできます。
条件に合う最初の要素を取得
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 3, 7, 12, 15, 20, 25 };
int firstOver10 = numbers.First(n => n > 10);
int lastEven = numbers.Last(n => n % 2 == 0);
Console.WriteLine($"10より大きい最初の数: {firstOver10}");
Console.WriteLine($"最後の偶数: {lastEven}");
}
}
実行結果:
10より大きい最初の数: 12
最後の偶数: 20
ラムダ式を使うことで、条件に合う要素を素早く見つけることができます。もし該当する要素が見つからない場合は、エラーが発生するので注意が必要です。
9. 重複を削除(Distinct)
Distinctメソッドは、リストから重複する要素を削除して、ユニークな値だけを残します。
重複を削除する例
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 2, 3, 3, 3, 4, 5, 5 };
var uniqueNumbers = numbers.Distinct();
foreach (var num in uniqueNumbers)
{
Console.WriteLine(num);
}
}
}
実行結果:
1
2
3
4
5
重複した値が自動的に削除され、一つずつだけ残ります。データの整理や分析をするときにとても便利なメソッドです。
10. 任意の条件チェック(Any・All)
Anyメソッドは「条件に合う要素が一つでもあるか」を確認し、Allメソッドは「すべての要素が条件に合うか」を確認します。どちらも真偽値(true/false)を返します。
条件チェックの例
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 2, 4, 6, 8, 10 };
bool hasOdd = numbers.Any(n => n % 2 != 0);
bool allEven = numbers.All(n => n % 2 == 0);
Console.WriteLine($"奇数が含まれている: {hasOdd}");
Console.WriteLine($"すべて偶数: {allEven}");
}
}
実行結果:
奇数が含まれている: False
すべて偶数: True
このように、リスト全体の状態を簡単にチェックできます。データの検証や条件判定に非常に役立つメソッドです。