Tổng hợp các cách tính tổng các phần tử của mảng trong C#

Đây có lẽ là một câu hỏi thường gặp trong các cuộc phỏng vấn lập trình viên .NET khi sử dụng mảng. Trong bài này, chúng ta sẽ tìm hiểu cách tính tổng các phần tử của một mảng trong C#. Sau khi nghiên cứu các kỹ thuật khác nhau, chúng ta xây dựng các kỹ thuật code và chú trọng vào hiệu suất và kiểm tra xem cái nào là cách tiếp cận tốt nhất để sử dụng trong mỗi tình huống.

Tổng hợp các cách tính tổng các phần tử của mảng trong C#

Sử dụng vòng lặp để tính tổng các phần tử của một mảng

1. Sử dụng vòng lặp For

Cụ thể bây giờ chúng ta sẽ tạo phương thức với đầu vào là một mảng:
public int ForLoop(int[] sourceArray)
{
    var result = 0;
    for (int i = 0; i < sourceArray.Length; i++)
        result += sourceArray[i];
    return result;
}

Phương thức này nhận một mảng làm tham số đầu vào và trả về một số nguyên đại diện cho tổng của tất cả các phần tử trong mảng. Bên trong nó, chúng tôi tạo một biến result mới và gán giá trị 0 cho nó. Sau đó, chúng tôi lặp qua toàn bộ mảng và tăng biến này với tổng của mỗi phần tử của mảng.

2. Sử dụng vòng lặp Foreach

Để sử dụng vòng lặp foreach, chúng ta sẽ tạo một phương thức ForeachLoop mới với code sau:
public int ForeachLoop(int[] sourceArray)
{
    var result = 0;
    foreach (var item in sourceArray)
        result += item;
    return result;
}

Tương tự như kỹ thuật trước, chúng ta định nghĩa một biến result và đối với mỗi phần tử trong mảng, tính tổng giá trị và lưu trữ nó vào biến này.

 Không có sự khác biệt lớn giữa việc sử dụng vòng lặp forvà foreach để đạt được kết quả này. Dù sao thì cũng tốt nếu đề cập và nghiên cứu cả hai phương pháp.

Sử dụng lớp Array để tính tổng các phần tử của một mảng

Một cách khác để đạt được kết quả này là sử dụng lớp Array:
public int ArrayForEach(int[] sourceArray)
{
    var result = 0;
    Array.ForEach(sourceArray, value => result += value);
    return result;
}

Trong cách tiếp cận này, chúng ta định nghĩa một biến result và gán giá trị 0 làm giá trị của nó. Sau đó, chúng ta sẽ sử dụng phương thức ForEach dưới lớp Array, để tính tổng tất cả các phần tử.

Với tham số đầu tiên của phương thức ForEach, nó nhận mảng mà chúng ta muốn lặp và với tham số thứ hai, nó nhận một action mà chúng ta có thể thực thi trên mỗi phần tử.

Sử dụng System.Linq để tính tổng các phần tử của một mảng

System.Linq là một namespace cung cấp cho chúng ta với các class, method mà chúng ta có thể dùng được để tính các phần tử trong một mảng. Cụ thể, ta có 2 cách với 2 methods sau:

1. Enumerable.Sum

Cách này rất đơn giản, ta sử dụng Linq để tính tổng các phần tử của mảng bằng cách sử dụng phương thức Sum từ lớp Enumerable:
return Enumerable.Sum(sourceArray);

Hoặc một cách khác đơn giản hơn:

return sourceArray.Sum();

Lưu ý rằng đây là một phương pháp mở rộng. Điều đó nói rằng, cả hai cách sẽ thực thi cùng một phương thức.

 

2. Enumerable.Aggregate

Và chúng ta cũng có thể dùng Enumerable.Aggregate để tính tổng các phần tử trong mảng bằng cách sử dụng:
return sourceArray.Aggregate((total, value) => total + value);

Aggregate thực hiện một thao tác trên mỗi phần tử của danh sách có tính đến các thao tác đã thực hiện trước đó. Điều đó có nghĩa là nó thực hiện hành động trên phần tử thứ nhất và thứ hai và mang kết quả về phía trước. Sau đó, nó hoạt động dựa trên kết quả trước đó và phần tử thứ ba và chuyển tiếp….

Lời kết

Như trên ta có thể thấy được, để ra được kết như mong muốn thì có rất nhiều cách, nhưng sau cùng ta cần chú tâm đến hiệu suất giữa các cách thực hiện. Ví dụ nhưng ta tính tổng 1 triệu phần tử trong tử trong mảng thì đâu là cách nhanh nhất.

Sau khi áp dụng Benchmark để so sánh hiệu năng thì ta thấy được thứ tự nhanh đến chậm nhất như sau: vòng lặp For, vòng lặp Foreach, ArrayForEach, EnumerableSum, ArraySum, Aggregate. Với hiệu năng của vòng lặp găps 13 lần Aggregate, vì thế bạn hãy chọn các phù hợp để áp dụng cho dự án của mình.

Nguồn tham khảo: https://code-maze.com/


Mong bài viết hữu ích, chúc các bạn thành công.

Hieu Ho.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *