Cách sử dụng phương thức Sum trong LINQ để tính tổng các phần tử trong C#

Trong lập trình C#, Sum() là một phương thức mở rộng (extension method) cực kỳ phổ biến thuộc namespace System.Linq. Phương thức này được thiết kế để tính toán tổng giá trị của các phần tử trong một tập hợp dữ liệu như List<T>, Array, hoặc bất kỳ đối tượng nào thực thi giao diện IEnumerable<T>.

1. Tính tổng các kiểu dữ liệu số cơ bản

Phương thức Sum() hỗ trợ trực tiếp các kiểu dữ liệu số như int, long, float, double, và decimal. Khi gọi phương thức này trên một danh sách số, nó sẽ cộng dồn tất cả các giá trị và trả về kết quả cuối cùng.

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

class Program
{
    static void Main()
    {
        // Danh sách các số nguyên
        List<int> danhSachSo = new List<int> { 10, 20, 30, 40, 50 };

        // Sử dụng Sum() để tính tổng
        int tongCong = danhSachSo.Sum();

        Console.WriteLine($"Tổng các số nguyên: {tongCong}"); // Output: 150
        
        // Ví dụ với kiểu số thực double
        var tiGia = new List<double> { 1.5, 2.5, 3.0 };
        double tongTiGia = tiGia.Sum();
        Console.WriteLine($"Tổng tỉ giá: {tongTiGia}"); // Output: 7.0
    }
}

2. Sử dụng Selector để tính tổng thuộc tính của đối tượng

Trong thực tế, chúng ta thường làm việc với các danh sách chứa đối tượng phức tạp. Phương thức Sum() cho phép truyền vào một biểu thức Lambda (Selector) để xác định trường dữ liệu cụ thể cần tính tổng.

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

class DonHang
{
    public string TenSanPham { get; set; }
    public decimal GiaTien { get; set; }
}

class Program
{
    static void Main()
    {
        List<DonHang> gioHang = new List<DonHang>
        {
            new DonHang { TenSanPham = "Laptop", GiaTien = 1200.50m },
            new DonHang { TenSanPham = "Chuột", GiaTien = 25.00m },
            new DonHang { TenSanPham = "Bàn phím", GiaTien = 45.75m }
        };

        // Tính tổng thuộc tính GiaTien từ danh sách đối tượng
        decimal tongThanhToan = gioHang.Sum(item => item.GiaTien);

        Console.WriteLine($"Tổng giá trị đơn hàng: {tongThanhToan}"); // Output: 1271.25
    }
}

3. Xử lý các trường hợp đặc biệt

Khi sử dụng Sum(), lập trình viên cần lưu ý một số hành vi mặc định của phương thức này để tránh lỗi logic:

  • Danh sách rỗng: Nếu bạn gọi Sum() trên một danh sách không có phần tử nào, phương thức sẽ trả về giá trị mặc định là 0 thay vì ném ra ngoại lệ.
  • Kiểu dữ liệu Nullable (T?): Nếu tập hợp chứa các giá trị null (ví dụ List<int?>), phương thức Sum() sẽ bỏ qua các giá trị null và tính tổng các phần tử còn lại. Nếu tất cả các phần tử đều là null, kết quả trả về là 0.
  • Hiệu năng:Sum() thực hiện duyệt qua toàn bộ danh sách (O(n)), nên đối với các tập dữ liệu cực lớn, bạn nên cân nhắc về thời điểm gọi phương thức để tối ưu hiệu suất ứng dụng.
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // Trường hợp danh sách chứa giá trị null
        List<int?> soCoTheNull = new List<int?> { 5, null, 15, null };
        int? tongNullable = soCoTheNull.Sum();
        
        Console.WriteLine($"Tổng với giá trị null: {tongNullable}"); // Output: 20

        // Trường hợp danh sách rỗng
        var danhSachRong = new List<float>();
        float tongRong = danhSachRong.Sum();
        
        Console.WriteLine($"Tổng danh sách rỗng: {tongRong}"); // Output: 0
    }
}

Thẻ: C# .NET linq Collections

Đăng vào ngày 20 tháng 7 lúc 16:50