# C# Arrays: Hướng dẫn cơ bản về cách lưu trữ nhiều giá trị

Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới của các mảng trong C#. Hãy tưởng tượng mảng như một hộp ma thuật có thể chứa nhiều mục cùng loại. Đó giống như một hộp sô-cô-la yêu thích của bạn, nhưng thay vì sô-cô-la, chúng ta đang lưu trữ dữ liệu!

## Mảng là gì?

Trước khi chúng ta đi sâu vào chi tiết, hãy hiểu về mảng. Mảng là một cấu trúc dữ liệu cho phép bạn lưu trữ nhiều giá trị cùng loại trong một biến duy nhất. Hãy tưởng tượng bạn là một giáo viên (như tôi!) và bạn muốn lưu trữ điểm số của 30 học sinh. Thay vì tạo 30 biến riêng biệt, bạn có thể sử dụng một mảng duy nhất để lưu trữ tất cả các điểm số đó. Đúng là rất tiện lợi, phải không?

## Khai báo mảng

Hãy bắt đầu với cơ bản nhất: cách khai báo một mảng. Cú pháp rất đơn giản:

```csharp
dataType[] arrayName;

Ví dụ, nếu chúng ta muốn khai báo một mảng các số nguyên, chúng ta sẽ viết:

C# - Arrays

int[] grades;

Dòng này cho biết chúng ta đang tạo một mảng có tên grades sẽ chứa các giá trị số nguyên. Nhưng nhớ rằng, vào thời điểm này, chúng ta chưa xác định số lượng điểm số chúng ta muốn lưu trữ hoặc các điểm số đó là gì.

Khởi tạo một mảng

Bây giờ chúng ta đã khai báo mảng, hãy cho nó một kích thước. Chúng ta có thể làm điều này theo một số cách:

Phương pháp 1: Xác định kích thước

int[] grades = new int[5];

Điều này tạo ra một mảng có thể chứa 5 giá trị số nguyên. Ban đầu, tất cả các phần tử sẽ được đặt thành giá trị mặc định cho số nguyên, đó là 0.

Phương pháp 2: Khởi tạo với các giá trị

int[] grades = new int[] { 85, 92, 78, 95, 88 };

Ở đây, chúng ta đang tạo mảng và ngay lập tức điền đầy các giá trị. C# thông minh đủ để nhận ra rằng chúng ta muốn một mảng có 5 phần tử dựa trên các giá trị chúng ta đã cung cấp.

Gán giá trị cho mảng

Giả sử chúng ta đã tạo mảng bằng Phương pháp 1, và bây giờ chúng ta muốn thêm một số điểm số. Chúng ta có thể làm điều này bằng cách truy cập từng phần tử của mảng bằng cách sử dụng chỉ số:

grades[0] = 85;  // Điểm đầu tiên
grades[1] = 92;  // Điểm thứ hai
grades[2] = 78;  // Điểm thứ ba
grades[3] = 95;  // Điểm thứ tư
grades[4] = 88;  // Điểm thứ năm

Nhớ rằng, chỉ số mảng trong C# (và hầu hết các ngôn ngữ lập trình khác) bắt đầu từ 0, không phải 1. Do đó, phần tử đầu tiên ở chỉ số 0, phần tử thứ hai ở chỉ số 1, và vân vân.

Truy cập phần tử mảng

Để truy cập các phần tử trong mảng, chúng ta sử dụng cùng cú pháp dấu vuông:

int firstGrade = grades[0];  // Điều này sẽ cho chúng ta 85
int thirdGrade = grades[2];  // Điều này sẽ cho chúng ta 78

Dưới đây là một chương trình nhỏ kết hợp tất cả những điều này:

int[] grades = new int[5];

grades[0] = 85;
grades[1] = 92;
grades[2] = 78;
grades[3] = 95;
grades[4] = 88;

Console.WriteLine("Các điểm số là:");
for (int i = 0; i < grades.Length; i++)
{
    Console.WriteLine($"Học sinh {i + 1}: {grades[i]}");
}

Chương trình này sẽ ra:

Các điểm số là:
Học sinh 1: 85
Học sinh 2: 92
Học sinh 3: 78
Học sinh 4: 95
Học sinh 5: 88

Sử dụng vòng lặp foreach

C# cung cấp một vòng lặp foreach tiện lợi giúp việc duyệt qua các mảng trở nên dễ dàng. Hãy viết lại ví dụ trước đó bằng cách sử dụng foreach:

int[] grades = new int[] { 85, 92, 78, 95, 88 };

Console.WriteLine("Các điểm số là:");
int studentNumber = 1;
foreach (int grade in grades)
{
    Console.WriteLine($"Học sinh {studentNumber}: {grade}");
    studentNumber++;
}

Vòng lặp foreach tự động duyệt qua từng phần tử trong mảng, gán nó vào biến grade trong mỗi lần lặp.

Mảng đa chiều

Đến nay, chúng ta đã làm việc với các mảng một chiều. Nhưng nếu chúng ta muốn tạo một sổ điểm cho nhiều môn học? Đây là lúc các mảng đa chiều phát huy tác dụng. Hãy tạo một mảng 2D để lưu trữ điểm số của 3 học sinh cho 4 môn học:

int[,] gradeBook = new int[3, 4]
{
    { 85, 92, 78, 95 },
    { 80, 89, 93, 87 },
    { 76, 88, 91, 84 }
};

Console.WriteLine("Sổ điểm:");
for (int i = 0; i < 3; i++)
{
    Console.Write($"Học sinh {i + 1}: ");
    for (int j = 0; j < 4; j++)
    {
        Console.Write($"{gradeBook[i, j]} ");
    }
    Console.WriteLine();
}

Điều này sẽ ra:

Sổ điểm:
Học sinh 1: 85 92 78 95
Học sinh 2: 80 89 93 87
Học sinh 3: 76 88 91 84

Phương thức mảng

C# cung cấp nhiều phương thức hữu ích để làm việc với mảng. Dưới đây là một số phương thức phổ biến nhất:

Phương thức Mô tả Ví dụ
Array.Sort() Sắp xếp các phần tử trong mảng Array.Sort(grades);
Array.Reverse() Đảo ngược thứ tự các phần tử trong mảng Array.Reverse(grades);
Array.Find() Tìm phần tử đầu tiên khớp với điều kiện xác định int firstPassingGrade = Array.Find(grades, grade => grade >= 60);
Array.FindAll() Tìm tất cả các phần tử khớp với điều kiện xác định int[] passingGrades = Array.FindAll(grades, grade => grade >= 60);
Array.IndexOf() Trả về chỉ số của phần tử đầu tiên xuất hiện int index = Array.IndexOf(grades, 95);

Dưới đây là một ví dụ nhanh sử dụng một số phương thức này:

int[] grades = new int[] { 85, 92, 78, 95, 88 };

Array.Sort(grades);
Console.WriteLine("Điểm số đã sắp xếp:");
foreach (int grade in grades)
{
    Console.Write($"{grade} ");
}
Console.WriteLine();

int highestGrade = grades[grades.Length - 1];
Console.WriteLine($"Điểm số cao nhất là: {highestGrade}");

int lowestGrade = grades[0];
Console.WriteLine($"Điểm số thấp nhất là: {lowestGrade}");

Chương trình này sẽ ra:

Điểm số đã sắp xếp:
78 85 88 92 95
Điểm số cao nhất là: 95
Điểm số thấp nhất là: 78

Và thế là bạn đã hoàn thành một chuyến đi nhanh qua các mảng trong C#. Nhớ rằng, việc thực hành sẽ giúp bạn thành thạo, vì vậy đừng ngần ngại thử nghiệm với các khái niệm này. Hãy thử tạo các loại mảng khác nhau, chơi với các mảng đa chiều, và khám phá các phương thức mảng khác. Trước khi bạn biết, bạn sẽ trở thành một phù thủy mảng, dễ dàng tạo ra các cấu trúc dữ liệu phức tạp!

Chúc các bạn lập trình vui vẻ! ??

Credits: Image by storyset