7 Cấu trúc mảng, dữ liệu mảng

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.

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:

MemberNội dung
LengthThuộc tính cho biết số lượng phần tử trong mảng
RankThuộ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ư:

MemberNộ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);
}
Để lại một bình luận 0

Your email address will not be published. Required fields are marked *