Day 58 のゴールと全体像
Day 58 では、LINQ を使った「集計」をテーマにします。 今日のキーワードは次の6つです。
- Count
- Sum
- Average
- Max
- Min
- GroupBy
ここまでで、LINQ の「絞り込み」「並び替え」「検索」はだいぶ見えてきました。 そこに「集計」が加わると、 一気に“データ分析っぽいこと”ができるようになっていきます。
売上の合計、平均点、最大値・最小値、カテゴリごとの集計―― 現場でよく見る処理ばかりです。 ひとつひとつ、落ち着いて見ていきましょう。
Count ― 件数を数える
Count の役割
Count は、
要素の数を数える
ためのメソッドです。
基本形のテンプレート
コレクション.Count()
コレクション.Count(x => 条件)
C#- 引数なし:全体の件数
- 条件あり:条件に合うものだけの件数
例1:全体の件数を数える
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 1, 2, 3, 4, 5 };
int count = numbers.Count(); // 要素数を数える
Console.WriteLine($"要素の数は {count} 件です。");
}
}
C#例2:条件に合う件数を数える
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 1, 2, 3, 4, 5, 6 };
// 偶数の件数を数える
int evenCount = numbers.Count(n => n % 2 == 0);
Console.WriteLine($"偶数の数は {evenCount} 件です。");
}
}
C#Count は「とりあえず件数を知りたい」ときに、 まず最初に思い出してほしいメソッドです。
Sum ― 合計を求める
Sum の役割
Sum は、
数値の合計を求める
ためのメソッドです。
基本形のテンプレート
数値コレクション.Sum()
コレクション.Sum(x => 数値プロパティ)
C#例1:単純な数値の合計
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 10, 20, 30 };
int total = numbers.Sum(); // 合計を求める
Console.WriteLine($"合計は {total} です。");
}
}
C#例2:オブジェクトのプロパティの合計
using System;
using System.Linq;
using System.Collections.Generic;
class Order
{
public string ProductName { get; set; }
public int Quantity { get; set; } // 個数
public int UnitPrice { get; set; } // 単価
}
class Program
{
static void Main()
{
var orders = new List<Order>
{
new Order { ProductName = "A", Quantity = 2, UnitPrice = 500 },
new Order { ProductName = "B", Quantity = 1, UnitPrice = 800 },
new Order { ProductName = "C", Quantity = 3, UnitPrice = 200 }
};
// 合計金額を求める(個数 × 単価 の合計)
int totalAmount = orders.Sum(o => o.Quantity * o.UnitPrice);
Console.WriteLine($"合計金額は {totalAmount} 円です。");
}
}
C#Sum は「売上」「点数」「数量」など、 “足し合わせたいもの”があるときに大活躍します。
Average ― 平均を求める
Average の役割
Average は、
数値の平均値を求める
ためのメソッドです。
基本形のテンプレート
数値コレクション.Average()
コレクション.Average(x => 数値プロパティ)
C#例1:テストの平均点を求める
using System;
using System.Linq;
class Program
{
static void Main()
{
var scores = new[] { 80, 90, 75, 60 };
double avg = scores.Average(); // 平均点
Console.WriteLine($"平均点は {avg} 点です。");
}
}
C#例2:ユーザーの平均年齢を求める
using System;
using System.Linq;
using System.Collections.Generic;
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 },
new User { Name = "鈴木一郎", Age = 30 }
};
double avgAge = users.Average(u => u.Age);
Console.WriteLine($"平均年齢は {avgAge:F1} 歳です。");
}
}
C#Average は戻り値が double になることが多いので、 小数点を含む値として扱うことを意識しておくと安心です。
Max / Min ― 最大値・最小値を求める
Max / Min の役割
Max は「最大値」、Min は「最小値」を求めるメソッドです。
基本形のテンプレート
数値コレクション.Max()
数値コレクション.Min()
コレクション.Max(x => 数値プロパティ)
コレクション.Min(x => 数値プロパティ)
C#例1:最大値・最小値を求める
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 10, 5, 30, 20 };
int max = numbers.Max();
int min = numbers.Min();
Console.WriteLine($"最大値は {max} です。");
Console.WriteLine($"最小値は {min} です。");
}
}
C#例2:最高点・最低点を求める
using System;
using System.Linq;
class Program
{
static void Main()
{
var scores = new[] { 80, 90, 75, 60 };
int maxScore = scores.Max();
int minScore = scores.Min();
Console.WriteLine($"最高点は {maxScore} 点です。");
Console.WriteLine($"最低点は {minScore} 点です。");
}
}
C#例3:ユーザーの最大年齢・最小年齢
using System;
using System.Linq;
using System.Collections.Generic;
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 },
new User { Name = "鈴木一郎", Age = 30 }
};
int maxAge = users.Max(u => u.Age);
int minAge = users.Min(u => u.Age);
Console.WriteLine($"最高年齢は {maxAge} 歳です。");
Console.WriteLine($"最年少は {minAge} 歳です。");
}
}
C#Max / Min は、 「一番大きいもの」「一番小さいもの」を知りたいときに、 まず思い出してほしいメソッドです。
GroupBy ― グループごとにまとめる
GroupBy の役割
GroupBy は、
指定したキーごとに、要素をグループ分けする
ためのメソッドです。
イメージとしては、
- 「カテゴリごとにまとめる」
- 「年齢層ごとに分ける」
- 「商品ごとに集計する」
といった処理の“入り口”になる機能です。
基本形のテンプレート
コレクション.GroupBy(x => グループのキー)
C#- 戻り値は「キー」と「そのキーに属する要素の集まり」を持つオブジェクトの集合
例1:カテゴリごとに商品をまとめる
using System;
using System.Linq;
using System.Collections.Generic;
class Product
{
public string Name { get; set; }
public string Category { get; set; } // カテゴリ(例:食品、文房具など)
public int Price { get; set; }
}
class Program
{
static void Main()
{
var products = new List<Product>
{
new Product { Name = "りんご", Category = "食品", Price = 120 },
new Product { Name = "ノート", Category = "文房具", Price = 200 },
new Product { Name = "鉛筆", Category = "文房具", Price = 80 },
new Product { Name = "パン", Category = "食品", Price = 150 }
};
// カテゴリごとにグループ分け
var groups = products.GroupBy(p => p.Category);
foreach (var group in groups)
{
Console.WriteLine($"カテゴリ: {group.Key}");
// group は「そのカテゴリに属する商品一覧」
foreach (var product in group)
{
Console.WriteLine($" {product.Name} ({product.Price}円)");
}
Console.WriteLine();
}
}
}
C#コードのポイント
GroupBy(p => p.Category)で、「Category プロパティ」をキーにグループ分けしています。group.Keyが「カテゴリ名」、group自体が「そのカテゴリに属する商品一覧」です。
例2:カテゴリごとの合計金額を求める
GroupBy と Sum を組み合わせると、 「グループごとの集計」が簡単に書けます。
using System;
using System.Linq;
using System.Collections.Generic;
class Product
{
public string Name { get; set; }
public string Category { get; set; }
public int Price { get; set; }
}
class Program
{
static void Main()
{
var products = new List<Product>
{
new Product { Name = "りんご", Category = "食品", Price = 120 },
new Product { Name = "パン", Category = "食品", Price = 150 },
new Product { Name = "ノート", Category = "文房具", Price = 200 },
new Product { Name = "鉛筆", Category = "文房具", Price = 80 }
};
var groups = products.GroupBy(p => p.Category);
Console.WriteLine("カテゴリごとの合計金額:");
foreach (var group in groups)
{
int total = group.Sum(p => p.Price); // そのカテゴリの合計金額
Console.WriteLine($"カテゴリ: {group.Key}, 合計: {total}円");
}
}
}
C#GroupBy は最初少しとっつきにくく感じるかもしれませんが、 「キーごとにまとめて、その中でさらに LINQ を使う」 という流れに慣れてくると、 とても強力な武器になってくれます。
LINQ集計のミニテンプレート
最後に、今日の内容をひとつにまとめた「LINQ集計テンプレート」を紹介します。
using System;
using System.Linq;
using System.Collections.Generic;
class Order
{
public string Category { get; set; } // カテゴリ
public int Quantity { get; set; } // 個数
public int UnitPrice { get; set; } // 単価
}
class Program
{
static void Main()
{
var orders = new List<Order>
{
new Order { Category = "食品", Quantity = 2, UnitPrice = 150 },
new Order { Category = "食品", Quantity = 1, UnitPrice = 200 },
new Order { Category = "文房具", Quantity = 3, UnitPrice = 80 },
new Order { Category = "文房具", Quantity = 1, UnitPrice = 200 }
};
// 全体の件数
int count = orders.Count();
// 全体の合計金額
int totalAmount = orders.Sum(o => o.Quantity * o.UnitPrice);
// 平均単価
double avgUnitPrice = orders.Average(o => o.UnitPrice);
// 最大単価・最小単価
int maxUnitPrice = orders.Max(o => o.UnitPrice);
int minUnitPrice = orders.Min(o => o.UnitPrice);
// カテゴリごとの合計金額
var groups = orders.GroupBy(o => o.Category);
Console.WriteLine($"注文件数: {count} 件");
Console.WriteLine($"合計金額: {totalAmount} 円");
Console.WriteLine($"平均単価: {avgUnitPrice:F1} 円");
Console.WriteLine($"最大単価: {maxUnitPrice} 円");
Console.WriteLine($"最小単価: {minUnitPrice} 円");
Console.WriteLine();
Console.WriteLine("カテゴリごとの合計金額:");
foreach (var group in groups)
{
int categoryTotal = group.Sum(o => o.Quantity * o.UnitPrice);
Console.WriteLine($"カテゴリ: {group.Key}, 合計: {categoryTotal} 円");
}
}
}
C#このテンプレートをベースに、
- プロパティを増やしてみる
- 集計内容を変えてみる
- GroupBy のキーを変えてみる
といった小さな工夫を重ねていくと、 LINQ 集計の感覚が、少しずつ手に馴染んでいきます。
Day 58 のまとめ
Day 58 では、
Countで件数を数えるSumで合計を求めるAverageで平均を求めるMax/Minで最大値・最小値を求めるGroupByでグループごとにまとめる
という、LINQ の「集計系メソッド」を学びました。
これらを使いこなせるようになると、
- 一覧データから「数字の意味」を引き出せる
- 集計・分析のコードを、短く読みやすく書ける
- 実務でよく見る「レポート」「ダッシュボード」の裏側が、ぐっと身近に感じられる
そんな感覚が少しずつ育っていきます。
ぜひ、
- 自分でデータを作って、いろいろな集計を試してみる
- GroupBy と他の集計メソッドを組み合わせてみる
といった小さな一歩を重ねながら、 LINQ 集計の楽しさを、自分のコードで味わっていっていただければうれしいです。
