C#のLINQ集計メソッド完全ガイド!Count・Sumの使い方を初心者向けに解説
生徒
「C#でデータの合計や件数を簡単に計算する方法ってありますか?」
先生
「はい、LINQの集計メソッドを使えば、データの合計や件数を簡単に計算できますよ。」
生徒
「具体的にはどんなメソッドがあるんですか?」
先生
「Count、Sum、Average、Max、Minなどがあります。それでは、基本的な使い方を見ていきましょう!」
1. LINQの集計メソッドとは?
C#のLINQ(リンク)には、データを集計するための便利なメソッドが用意されています。これらの集計メソッドを使うと、配列やリストなどのコレクションに対して、合計や平均、最大値などを簡単に計算できます。
例えば、クラスの生徒の点数が入った配列があったとします。この点数の合計を計算したいとき、従来なら繰り返し処理を書いて一つずつ足し算していく必要がありました。しかし、LINQの集計メソッドを使えば、たった一行のコードで合計が計算できるのです。
主な集計メソッドには、以下のようなものがあります。
Count():データの個数を数えるSum():データの合計を計算するAverage():データの平均を計算するMax():データの最大値を取得するMin():データの最小値を取得する
2. Count()メソッド:データの個数を数える
Count()メソッドは、配列やリストなどのコレクションに含まれる要素の個数を数えるメソッドです。例えば、買い物リストに何個の商品があるかを数えたいときなどに使います。
基本的な使い方
まずは、単純に配列の要素数を数える例を見てみましょう。
using System;
using System.Linq;
int[] numbers = { 10, 20, 30, 40, 50 };
int count = numbers.Count();
Console.WriteLine($"要素の個数: {count}");
このコードでは、numbersという配列に5つの数値が入っています。Count()メソッドを使うことで、配列内の要素数を取得できます。
要素の個数: 5
条件付きでカウントする
Count()メソッドには、条件を指定することもできます。例えば、「50より大きい数値がいくつあるか」を数えることができます。
using System;
using System.Linq;
int[] numbers = { 10, 20, 60, 40, 80, 30 };
int count = numbers.Count(n => n > 50);
Console.WriteLine($"50より大きい数値の個数: {count}");
ここで使っているn => n > 50は、ラムダ式と呼ばれる書き方で、「nが50より大きい」という条件を表しています。この条件に一致する要素だけを数えることができます。
50より大きい数値の個数: 2
3. Sum()メソッド:データの合計を計算する
Sum()メソッドは、配列やリストに含まれる数値の合計を計算するメソッドです。例えば、一週間の売上データから合計売上を計算したいときなどに使います。
基本的な使い方
数値の配列の合計を計算する例を見てみましょう。
using System;
using System.Linq;
int[] sales = { 1000, 1500, 2000, 1200, 1800 };
int total = sales.Sum();
Console.WriteLine($"合計売上: {total}円");
このコードでは、salesという配列に5日分の売上が入っています。Sum()メソッドを使うことで、これらの合計を一行で計算できます。
合計売上: 7500円
オブジェクトのプロパティを合計する
実際の開発では、単純な数値の配列だけでなく、クラスのオブジェクトが入ったリストを扱うことも多くあります。例えば、商品クラスのリストから価格の合計を計算する場合を見てみましょう。
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 }
};
int totalPrice = products.Sum(p => p.Price);
Console.WriteLine($"商品の合計金額: {totalPrice}円");
}
}
ここでは、Productクラスを作成し、商品名と価格を持たせています。Sum()メソッドにラムダ式p => p.Priceを渡すことで、各商品の価格プロパティを合計しています。
商品の合計金額: 330円
4. Average()メソッド:データの平均を計算する
Average()メソッドは、データの平均値を計算するメソッドです。テストの点数の平均や、月間の平均売上などを計算するときに使います。
using System;
using System.Linq;
int[] scores = { 80, 75, 90, 85, 70 };
double average = scores.Average();
Console.WriteLine($"平均点: {average}点");
このコードでは、5人のテストの点数から平均点を計算しています。Average()メソッドは、合計を個数で割った値を返します。戻り値の型はdouble(小数を含む数値型)になります。
平均点: 80点
5. Max()とMin()メソッド:最大値と最小値を取得する
Max()メソッドはデータの中から最大値を、Min()メソッドは最小値を取得するメソッドです。例えば、売上データから最高売上と最低売上を見つけたいときなどに使います。
using System;
using System.Linq;
int[] temperatures = { 25, 30, 22, 28, 35, 20 };
int maxTemp = temperatures.Max();
int minTemp = temperatures.Min();
Console.WriteLine($"最高気温: {maxTemp}度");
Console.WriteLine($"最低気温: {minTemp}度");
このコードでは、一週間の気温データから最高気温と最低気温を取得しています。Max()で最大値、Min()で最小値を簡単に取得できます。
最高気温: 35度
最低気温: 20度
6. 複数の集計メソッドを組み合わせる
実際の開発では、複数の集計メソッドを組み合わせて使うことがよくあります。例えば、売上データから合計、平均、最大値、最小値をまとめて計算する場合を見てみましょう。
using System;
using System.Linq;
int[] dailySales = { 15000, 18000, 12000, 20000, 16000, 22000, 14000 };
int total = dailySales.Sum();
double average = dailySales.Average();
int max = dailySales.Max();
int min = dailySales.Min();
int count = dailySales.Count();
Console.WriteLine($"売上件数: {count}日");
Console.WriteLine($"合計売上: {total}円");
Console.WriteLine($"平均売上: {average}円");
Console.WriteLine($"最高売上: {max}円");
Console.WriteLine($"最低売上: {min}円");
このように、一つのデータに対して複数の集計メソッドを使うことで、さまざまな角度からデータを分析できます。これは、売上レポートや成績表などを作成するときに非常に便利です。
売上件数: 7日
合計売上: 117000円
平均売上: 16714.285714285714円
最高売上: 22000円
最低売上: 12000円
7. 空のコレクションを扱うときの注意点
集計メソッドを使うときに注意が必要なのは、空のコレクション(要素が一つもない配列やリスト)を扱う場合です。空のコレクションに対してAverage()、Max()、Min()を使うと、エラーが発生します。
using System;
using System.Linq;
int[] emptyArray = { };
// Count()とSum()は問題なし
int count = emptyArray.Count(); // 結果: 0
int sum = emptyArray.Sum(); // 結果: 0
Console.WriteLine($"個数: {count}");
Console.WriteLine($"合計: {sum}");
// Average(), Max(), Min()は要素がないとエラーになる
// double avg = emptyArray.Average(); // エラー!
空のコレクションを扱う可能性がある場合は、まずCount()やAny()メソッドで要素があるかを確認してから集計メソッドを使うと安全です。
個数: 0
合計: 0
8. 実践的な例:学生の成績管理
最後に、LINQの集計メソッドを使った実践的な例として、学生の成績を管理するプログラムを作成してみましょう。
using System;
using System.Linq;
using System.Collections.Generic;
class Student
{
public string Name { get; set; }
public int Score { get; set; }
}
class Program
{
static void Main()
{
List<Student> students = new List<Student>
{
new Student { Name = "田中", Score = 85 },
new Student { Name = "佐藤", Score = 92 },
new Student { Name = "鈴木", Score = 78 },
new Student { Name = "高橋", Score = 88 },
new Student { Name = "渡辺", Score = 95 }
};
int studentCount = students.Count();
int totalScore = students.Sum(s => s.Score);
double averageScore = students.Average(s => s.Score);
int highestScore = students.Max(s => s.Score);
int lowestScore = students.Min(s => s.Score);
int passCount = students.Count(s => s.Score >= 80);
Console.WriteLine("===== 成績レポート =====");
Console.WriteLine($"学生数: {studentCount}人");
Console.WriteLine($"合計点: {totalScore}点");
Console.WriteLine($"平均点: {averageScore}点");
Console.WriteLine($"最高点: {highestScore}点");
Console.WriteLine($"最低点: {lowestScore}点");
Console.WriteLine($"80点以上: {passCount}人");
}
}
このプログラムでは、学生のクラスを作成し、名前と点数を管理しています。さまざまな集計メソッドを組み合わせることで、総合的な成績レポートを作成できます。条件付きのCount()を使えば、特定の点数以上の学生数も簡単に数えられます。
===== 成績レポート =====
学生数: 5人
合計点: 438点
平均点: 87.6点
最高点: 95点
最低点: 78点
80点以上: 4人