基礎から学ぶC#入門 90日コース | 実践的なC#プログラミング - Day 58:LINQ集計

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

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:カテゴリごとの合計金額を求める

GroupBySum を組み合わせると、 「グループごとの集計」が簡単に書けます。

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 集計の楽しさを、自分のコードで味わっていっていただければうれしいです。

タイトルとURLをコピーしました