LINQ

[C#/LINQ] Sumメソッドの使い方 – 要素の合計値を計算する

C#のLINQにおけるSumメソッドは、コレクション内の数値要素の合計を計算するために使用されます。

Sumは整数や浮動小数点数などの数値型に対して使用でき、コレクションが空の場合は0を返します。

例えば、IEnumerable<int>List<double>などのコレクションに対してSum()を呼び出すことで、全要素の合計を取得できます。

また、オブジェクトのプロパティを合計する場合は、ラムダ式を使って特定のプロパティを指定することも可能です。

Sumメソッドとは

C#のLINQ(Language Integrated Query)におけるSumメソッドは、コレクション内の数値要素の合計を計算するための便利な機能です。

このメソッドは、配列やリストなどのコレクションに対して使用でき、数値型のデータを持つ要素を簡単に合計することができます。

Sumメソッドは、特にデータ分析や集計処理を行う際に非常に役立ちます。

Sumメソッドは、基本的に次のように使用されます。

コレクションに対してSumメソッドを呼び出すことで、要素の合計値を取得できます。

例えば、整数のリストがある場合、そのリストの全ての整数を合計することができます。

LINQを使用することで、コードがシンプルになり、可読性も向上します。

これにより、開発者はより効率的にプログラミングを行うことが可能になります。

Sumメソッドの基本的な使い方

数値型コレクションに対するSumの使用例

数値型のコレクションに対してSumメソッドを使用する基本的な例を見てみましょう。

以下のコードでは、整数のリストを作成し、その合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 整数のリストを作成
        int total = numbers.Sum(); // Sumメソッドを使用して合計を計算
        Console.WriteLine($"合計: {total}"); // 合計を出力
    }
}
合計: 15

空のコレクションに対するSumの挙動

空のコレクションに対してSumメソッドを使用すると、結果は0になります。

以下のコードでは、空のリストに対してSumメソッドを適用しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> emptyList = new List<int>(); // 空のリストを作成
        int total = emptyList.Sum(); // Sumメソッドを使用
        Console.WriteLine($"合計: {total}"); // 合計を出力
    }
}
合計: 0

null値を含むコレクションに対するSumの挙動

null値を含むコレクションに対してSumメソッドを使用すると、例外が発生します。

以下のコードでは、null値を含むリストに対してSumメソッドを適用しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int?> numbersWithNulls = new List<int?> { 1, 2, null, 4, 5 }; // nullを含むリストを作成
        int total = numbersWithNulls.Sum() ?? 0; // nullを無視して合計を計算
        Console.WriteLine($"合計: {total}"); // 合計を出力
    }
}
合計: 12

ラムダ式を使ったSumの使用例

ラムダ式を使用することで、特定の条件に基づいて合計を計算することができます。

以下のコードでは、特定の条件を満たす要素の合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 整数のリストを作成
        int total = numbers.Where(n => n > 2).Sum(); // 2より大きい数の合計を計算
        Console.WriteLine($"合計: {total}"); // 合計を出力
    }
}
合計: 12

このように、Sumメソッドはさまざまな状況で利用でき、非常に柔軟な機能を提供します。

オブジェクトコレクションに対するSumの使い方

特定のプロパティを合計する方法

オブジェクトコレクションに対してSumメソッドを使用する場合、特定のプロパティの合計を計算することができます。

以下の例では、ProductクラスPriceプロパティを持つオブジェクトのリストから、合計金額を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
    public string Name { get; set; } // 商品名
    public decimal Price { get; set; } // 価格
}
class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "商品A", Price = 1000 },
            new Product { Name = "商品B", Price = 1500 },
            new Product { Name = "商品C", Price = 2000 }
        }; // 商品のリストを作成
        decimal totalPrice = products.Sum(p => p.Price); // Priceプロパティの合計を計算
        Console.WriteLine($"合計金額: {totalPrice}"); // 合計金額を出力
    }
}
合計金額: 4500

匿名型を使ったSumの使用例

匿名型を使用することで、特定のプロパティを持つオブジェクトを簡単に作成し、その合計を計算することができます。

以下の例では、匿名型を使って商品名と価格を持つオブジェクトを作成し、価格の合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        var products = new[]
        {
            new { Name = "商品A", Price = 1000 },
            new { Name = "商品B", Price = 1500 },
            new { Name = "商品C", Price = 2000 }
        }; // 匿名型の配列を作成
        decimal totalPrice = products.Sum(p => p.Price); // Priceプロパティの合計を計算
        Console.WriteLine($"合計金額: {totalPrice}"); // 合計金額を出力
    }
}
合計金額: 4500

複数のプロパティを合計する方法

複数のプロパティを合計する場合、Sumメソッドを使ってそれぞれのプロパティを合計し、最終的な合計を計算することができます。

以下の例では、ProductクラスQuantityプロパティを追加し、価格と数量の合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
    public string Name { get; set; } // 商品名
    public decimal Price { get; set; } // 価格
    public int Quantity { get; set; } // 数量
}
class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "商品A", Price = 1000, Quantity = 2 },
            new Product { Name = "商品B", Price = 1500, Quantity = 3 },
            new Product { Name = "商品C", Price = 2000, Quantity = 1 }
        }; // 商品のリストを作成
        decimal totalValue = products.Sum(p => p.Price * p.Quantity); // 価格と数量の合計を計算
        Console.WriteLine($"合計金額: {totalValue}"); // 合計金額を出力
    }
}
合計金額: 8500

このように、Sumメソッドを使用することで、オブジェクトコレクションの特定のプロパティや複数のプロパティの合計を簡単に計算することができます。

Sumメソッドの応用例

条件付きで合計を計算する方法(Where句との併用)

Sumメソッドは、Where句と組み合わせることで、特定の条件を満たす要素の合計を計算することができます。

以下の例では、価格が1500以上の商品だけを対象に合計金額を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
    public string Name { get; set; } // 商品名
    public decimal Price { get; set; } // 価格
}
class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "商品A", Price = 1000 },
            new Product { Name = "商品B", Price = 1500 },
            new Product { Name = "商品C", Price = 2000 }
        }; // 商品のリストを作成
        decimal totalPrice = products
            .Where(p => p.Price >= 1500) // 価格が1500以上の商品をフィルタリング
            .Sum(p => p.Price); // 合計を計算
        Console.WriteLine($"合計金額: {totalPrice}"); // 合計金額を出力
    }
}
合計金額: 3500

グループ化されたデータに対する合計(GroupByとの併用)

GroupByメソッドを使用することで、データをグループ化し、各グループの合計を計算することができます。

以下の例では、商品をカテゴリごとにグループ化し、各カテゴリの合計金額を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
    public string Name { get; set; } // 商品名
    public decimal Price { get; set; } // 価格
    public string Category { get; set; } // カテゴリ
}
class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "商品A", Price = 1000, Category = "カテゴリ1" },
            new Product { Name = "商品B", Price = 1500, Category = "カテゴリ1" },
            new Product { Name = "商品C", Price = 2000, Category = "カテゴリ2" }
        }; // 商品のリストを作成
        var totalByCategory = products
            .GroupBy(p => p.Category) // カテゴリでグループ化
            .Select(g => new
            {
                Category = g.Key,
                TotalPrice = g.Sum(p => p.Price) // 各グループの合計を計算
            }); 
        foreach (var item in totalByCategory)
        {
            Console.WriteLine($"カテゴリ: {item.Category}, 合計金額: {item.TotalPrice}"); // 合計金額を出力
        }
    }
}
カテゴリ: カテゴリ1, 合計金額: 2500
カテゴリ: カテゴリ2, 合計金額: 2000

Selectメソッドとの組み合わせによる合計

Selectメソッドを使用することで、特定のプロパティを選択し、その合計を計算することができます。

以下の例では、商品の価格を2倍にしてから合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
    public string Name { get; set; } // 商品名
    public decimal Price { get; set; } // 価格
}
class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "商品A", Price = 1000 },
            new Product { Name = "商品B", Price = 1500 },
            new Product { Name = "商品C", Price = 2000 }
        }; // 商品のリストを作成
        decimal totalPrice = products
            .Select(p => p.Price * 2) // 価格を2倍にする
            .Sum(); // 合計を計算
        Console.WriteLine($"合計金額: {totalPrice}"); // 合計金額を出力
    }
}
合計金額: 9000

複数のコレクションを結合して合計を計算する方法(Joinとの併用)

複数のコレクションを結合し、その結果に対して合計を計算することも可能です。

以下の例では、商品とそのカテゴリを結合し、各商品の価格の合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;

class Product
{
    public string Name { get; set; } // 商品名
    public decimal Price { get; set; } // 価格
    public int CategoryId { get; set; } // カテゴリID
}

class Category
{
    public int Id { get; set; } // カテゴリID
    public string Name { get; set; } // カテゴリ名
}

class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "商品A", Price = 1000, CategoryId = 1 },
            new Product { Name = "商品B", Price = 1500, CategoryId = 1 },
            new Product { Name = "商品C", Price = 2000, CategoryId = 2 }
        }; // 商品のリストを作成

        List<Category> categories = new List<Category>
        {
            new Category { Id = 1, Name = "カテゴリ1" },
            new Category { Id = 2, Name = "カテゴリ2" }
        }; // カテゴリのリストを作成

        var totalPrice = products
            .Join(categories,
                  p => p.CategoryId,
                  c => c.Id,
                  (p, c) => new { ProductName = p.Name, p.Price, CategoryName = c.Name }) // 商品とカテゴリを結合
            .Sum(x => x.Price); // 合計を計算

        Console.WriteLine($"合計金額: {totalPrice}"); // 合計金額を出力
    }
}
合計金額: 4500

このように、Sumメソッドはさまざまな方法で応用でき、複雑なデータ処理を簡単に行うことができます。

Sumメソッドと他の集計メソッドの比較

SumとCountの違い

SumメソッドCountメソッドは、どちらもコレクションに対する集計を行いますが、目的が異なります。

Sumメソッドは、数値型の要素の合計を計算するために使用されます。

一方、Countメソッドは、コレクション内の要素の数をカウントします。

以下の例でその違いを示します。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 整数のリストを作成
        int totalSum = numbers.Sum(); // Sumメソッドを使用
        int totalCount = numbers.Count(); // Countメソッドを使用
        Console.WriteLine($"合計: {totalSum}, 要素数: {totalCount}"); // 合計と要素数を出力
    }
}
合計: 15, 要素数: 5

SumとAverageの違い

SumメソッドAverageメソッドも異なる目的を持っています。

Sumメソッドは要素の合計を計算しますが、Averageメソッドは要素の平均値を計算します。

以下の例では、SumメソッドAverageメソッドの使い方を示します。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 整数のリストを作成
        int totalSum = numbers.Sum(); // Sumメソッドを使用
        double average = numbers.Average(); // Averageメソッドを使用
        Console.WriteLine($"合計: {totalSum}, 平均: {average}"); // 合計と平均を出力
    }
}
合計: 15, 平均: 3

SumとAggregateの違い

SumメソッドAggregateメソッドは、どちらも集計を行いますが、Aggregateメソッドはより一般的で柔軟な機能を提供します。

Sumメソッドは数値型の合計を計算するために特化していますが、Aggregateメソッドは任意の集計操作を実行できます。

以下の例では、Aggregateメソッドを使用して合計を計算しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 整数のリストを作成
        int totalSumUsingAggregate = numbers.Aggregate(0, (acc, n) => acc + n); // Aggregateメソッドを使用
        Console.WriteLine($"合計: {totalSumUsingAggregate}"); // 合計を出力
    }
}
合計: 15

このように、Sumメソッドは特定の用途に特化した集計メソッドであり、Count、Average、Aggregateなどの他の集計メソッドと組み合わせて使用することで、さまざまなデータ処理を行うことができます。

まとめ

この記事では、C#のLINQにおけるSumメソッドの基本的な使い方から、オブジェクトコレクションに対する応用例、他の集計メソッドとの比較まで幅広く解説しました。

Sumメソッドは、数値型の要素の合計を簡単に計算できる強力な機能であり、条件付きの合計やグループ化されたデータの合計など、さまざまなシナリオで活用できます。

これを機に、Sumメソッドを使ってデータ処理を効率化し、より複雑な集計処理に挑戦してみてはいかがでしょうか。

関連記事

Back to top button