Trong C#, mảng (array) là một cấu trúc dữ liệu cho phép lưu trữ một tập hợp các phần tử có cùng kiểu dữ liệu trong các vị trí bộ nhớ liên tiếp. Mảng giúp quản lý và thao tác với nhiều giá trị một cách hiệu quả, đặc biệt khi làm việc với số lượng lớn dữ liệu.
Contents
Khai báo và khởi tạo mảng
Để khai báo một mảng trong C#, bạn sử dụng cú pháp:
kiểu_dữ_liệu[] tên_mảng;
Ví dụ, để khai báo một mảng số nguyên:
int[] mangSoNguyen;
Sau khi khai báo, bạn cần khởi tạo mảng để cấp phát bộ nhớ:
mangSoNguyen = new int[5]; // Mảng có 5 phần tử
Bạn cũng có thể khai báo và khởi tạo mảng đồng thời:
int[] mangSoNguyen = new int[5];
Hoặc khởi tạo mảng với các giá trị ban đầu:
int[] mangSoNguyen = new int[] { 1, 2, 3, 4, 5 };
Trong trường hợp này, bạn có thể bỏ từ khóa new int[]
:
int[] mangSoNguyen = { 1, 2, 3, 4, 5 };
Truy cập và thao tác với các phần tử mảng
Các phần tử trong mảng được truy cập thông qua chỉ số (index), bắt đầu từ 0. Bạn có thể gán giá trị hoặc lấy giá trị của một phần tử bằng cách sử dụng cú pháp:
tên_mảng[chỉ_số] = giá_trị; // Gán giá trị
giá_trị = tên_mảng[chỉ_số]; // Lấy giá trị
Ví dụ:
mangSoNguyen[0] = 10; // Gán giá trị 10 cho phần tử đầu tiên
int giaTri = mangSoNguyen[0]; // Lấy giá trị của phần tử đầu tiên
Duyệt qua các phần tử của mảng
Bạn có thể sử dụng vòng lặp for
hoặc foreach
để duyệt qua các phần tử của mảng:
- Sử dụng vòng lặp
for
:
for (int i = 0; i < mangSoNguyen.Length; i++)
{
Console.WriteLine(mangSoNguyen[i]);
}
- Sử dụng vòng lặp
foreach
:
foreach (int giaTri in mangSoNguyen)
{
Console.WriteLine(giaTri);
}
Mảng đa chiều
C# hỗ trợ mảng đa chiều, bao gồm mảng hai chiều, ba chiều, v.v. Mảng hai chiều thường được sử dụng để biểu diễn bảng hoặc ma trận.
- Khai báo và khởi tạo mảng hai chiều:
int[,] maTran = new int[3, 4]; // Mảng 3 hàng, 4 cột
- Gán giá trị cho phần tử trong mảng hai chiều:
maTran[0, 0] = 1; // Gán giá trị 1 cho phần tử ở hàng 0, cột 0
- Duyệt qua mảng hai chiều:
for (int i = 0; i < maTran.GetLength(0); i++) // Duyệt qua các hàng
{
for (int j = 0; j < maTran.GetLength(1); j++) // Duyệt qua các cột
{
Console.WriteLine($"Phần tử tại ({i}, {j}) = {maTran[i, j]}");
}
}
Mảng jagged (mảng của mảng)
Mảng jagged là mảng các mảng, trong đó mỗi mảng con có thể có độ dài khác nhau.
- Khai báo và khởi tạo mảng jagged:
int[][] mangJagged = new int[3][];
mangJagged[0] = new int[2]; // Mảng con đầu tiên có 2 phần tử
mangJagged[1] = new int[3]; // Mảng con thứ hai có 3 phần tử
mangJagged[2] = new int[1]; // Mảng con thứ ba có 1 phần tử
- Gán giá trị và truy cập phần tử trong mảng jagged:
mangJagged[0][0] = 1; // Gán giá trị 1 cho phần tử đầu tiên của mảng con đầu tiên
int giaTri = mangJagged[0][0]; // Lấy giá trị của phần tử đầu tiên của mảng con đầu tiên
- Duyệt qua mảng jagged:
for (int i = 0; i < mangJagged.Length; i++)
{
for (int j = 0; j < mangJagged[i].Length; j++)
{
Console.WriteLine($"Phần tử tại [{i}][{j}] = {mangJagged[i][j]}");
}
}
Việc hiểu và sử dụng thành thạo các loại mảng trong C# sẽ giúp bạn quản lý và xử lý dữ liệu hiệu quả hơn trong quá trình lập trình.
Thuộc tính và phương thức đối tượng mảng
Các biến mảng thực chất được tạo ra từ lớp có lơps cơ sở là System.Array, nên nó có các thuộc tính phương thức của lớp này. Một số thuộc tính và phương thức như sau:
Member | Nội dung |
---|---|
Length | Thuộc tính cho biết số lượng phần tử trong mảng |
Rank | Thuộc tính cho biết số chiều mảng |
Clone() | Copy (nhân bản) đối tượng mảng |
GetValue(index) | Lấy giá trị phần tử trong mảng |
Min() | Trả về giá trị nhỏ nhất trong mảng |
Max() | Trả về giá trị lớn nhất trong mảng |
Sum() | Trả về giá trị tổng cộng các phần tử |
Chú ý cần nạp thư viện Linq bằng using System.Linq;
ở đầu để có phương thức Max(), Min(), Sum()
Một số phương thức tĩnh trong Array áp dụng vào mảng như:
Member | Nội dung |
---|---|
Array.BinarySearch(array, value) | Tìm kiếm phần tử trong mảng đã được sắp xếp, trả về chỉ số nếu tìm thấy |
CopyTo(array, indexStart) | Sao chép phần tử mảng này sang mảng khác |
Array.Clear(array, index, length) | Thiết lập phần tử mảng nhận giá trị mặc định |
bool Exists<T> (array, Predicate<T> match); | Kiểm tra có phần tử trong mảng thỏa mãn match |
Fill<T> (array, value); | Gán các phần tử của mảng bằng value |
T Find<T> (array, Predicate<T> match); | Tìm phần tử mảng |
int FindIndex<T> (array, Predicate<T> match); | Tìm phần tử mảng, trả về chỉ số nếu thấy |
T[] FindAll<T> (array, Predicate<T> match); | Tìm tất cả phần tử mảng |
int IndexOf(array, value) | Tìm chỉ số của phần tử |
ForEach(array, Action<T> action) | Thi hành action trên mỗi phần tử |
Sort(array) | Sắp xếp |
Ví dụ, duyệt qua các phần tử mảng kiểu int, và in ra nội dung phần tử
static void testForEach()
{
int[] numbers = {9, 8, 7, 6, 5, 4, 3, 2, 1 };
Array.ForEach<int>(numbers, (int n) => {
Console.WriteLine(n);
});
}
Ví dụ, tìm các số chẵn (chia hết cho 2) trong mảng số nguyên rồi in kết quả tìm được
static void testFindAll()
{
int[] numbers = {9, 8, 7, 6, 5, 4, 3, 2, 1 };
// Định nghĩa Predicate là một delegate tham số kiểu int
// trả về true nếu số chia hết cho 2
Predicate<int> predicate = (int number) => {
return number % 2 == 0;
};
// Tìm các số chẵn
int[] cacsochan = Array.FindAll(numbers, predicate);
// In kết quả
Action<int> printnumber = (int number) => Console.WriteLine(number);
Array.ForEach(cacsochan, printnumber);
}