1. Giới thiệu
Bình thường thì muốn làm gì với mảng nhỉ?
Cùng điểm qua các thao tác cơ bản nhé:
- Đọc và thay đổi phần tử của mảng theo chỉ số.
- Tìm phần tử theo giá trị.
- Sao chép mảng, tạo “lát cắt” (một phần của mảng).
- Sắp xếp mảng.
- Đảo ngược (reverse) mảng.
- Điền giá trị cho mảng.
- Kiểm tra xem mảng có chứa giá trị nào đó không.
- Thay đổi độ dài (resize).
Trong thực tế, bạn sẽ gặp mấy thao tác này suốt — ví dụ như “có tổng nào lớn hơn 4000 không?”, “tìm giá đầu tiên nhỏ hơn 1000”, “sắp xếp giá tăng dần” v.v.
Và cho tất cả những thứ này, ta đều có function
| Thao tác | Method / Cú pháp | Đặc điểm |
|---|---|---|
| Thay đổi theo chỉ số | |
Lỗi nếu vượt biên |
| Tìm giá trị | |
-1 nếu không tìm thấy |
| Kiểm tra tồn tại | |
Lambda hoặc function |
| Sắp xếp | |
Mảng thay đổi trực tiếp |
| Đảo ngược | |
Đổi thứ tự phần tử |
| Sao chép | |
Sao chép nông |
| Điền giá trị | |
Điền cùng một giá trị |
| Thay đổi kích thước | |
Phần tử mới — default |
| Tìm max/min | |
Cần Linq |
2. Đọc và thay đổi phần tử theo chỉ số
Cái này chắc ai cũng biết rồi, nhưng cùng ôn lại bằng ví dụ đơn giản (giả sử có mảng điểm):
// Mảng điểm của sinh viên
int[] grades = { 4, 3, 5, 2, 5 };
// Đọc điểm đầu tiên
int firstGrade = grades[0];
Console.WriteLine($"Điểm đầu tiên: {firstGrade}");
// Đổi điểm cuối thành "xuất sắc" (5)
grades[^1] = 5;
Console.WriteLine("Điểm cuối đã đổi: " + grades[^1]);
Lưu ý: chỉ số bắt đầu từ 0, truy cập chỉ số không tồn tại sẽ bị lỗi IndexOutOfRangeException — câu hỏi kinh điển khi phỏng vấn và cả ngoài đời.
3. Tìm phần tử trong mảng
Có hai function để tìm phần tử trong mảng, trả về chỉ số nếu tìm thấy.
Function Array.IndexOf(value [, from])
Function Array.IndexOf tìm phần tử từ đầu mảng. Nếu tìm thấy thì trả về chỉ số, không thì trả về -1.
Nếu muốn tìm các lần xuất hiện tiếp theo của phần tử, truyền thêm tham số thứ hai — chỉ số bắt đầu tìm. Thường là chỉ số vừa tìm được + 1.
Cùng tìm tất cả vị trí của số 2 trong mảng nhé:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // phần tử cần tìm
int index = Array.IndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"Phần tử {x} tìm thấy ở vị trí: {index}");
// Tìm tiếp từ vị trí index + 1
index = Array.IndexOf(grades, x, index + 1);
}
Function Array.LastIndexOf(value [, from])
Function Array.LastIndexOf tìm phần tử từ cuối mảng. Nếu tìm thấy thì trả về chỉ số, không thì trả về -1. Còn lại giống hệt Array.IndexOf.
Cùng tìm tất cả vị trí của số 2 trong mảng, nhưng tìm từ cuối nhé:
int[] grades = { 4, 3, 5, 2, 5, 2 };
int x = 2; // phần tử cần tìm
int index = Array.LastIndexOf(grades, x);
while (index != -1)
{
Console.WriteLine($"Phần tử {x} tìm thấy ở vị trí: {index}");
// Tìm tiếp từ vị trí trước đó - 1
index = Array.LastIndexOf(grades, x, index - 1);
}
4. Kiểm tra phần tử có trong mảng không
Để kiểm tra có phần tử nào đó không, dùng function Contains. Method này trả về true nếu mảng chứa phần tử đó. Nhớ import module System.Linq nhé. Ví dụ:
using System.Linq; // Nhớ thêm using System.Linq; nếu chưa có
bool hasExcellent = grades.Contains(5);
Console.WriteLine($"Có điểm 5 không? {hasExcellent}");
Dễ hiểu và đẹp luôn.
5. Đảo ngược mảng: Array.Reverse
Giả sử bạn muốn đảo mảng “ngược đầu đuôi”. Dùng ngay:
int[] grades = { 2, 3, 4, 5 };
// Đảo mảng
Array.Reverse(grades);
Console.WriteLine("Điểm đảo ngược: " + string.Join(", ", grades));
Rất tiện khi cần lấy “dữ liệu mới nhất” hoặc đơn giản là thích nhìn đời ngược lại.
6. Sắp xếp mảng: Array.Sort
Sớm muộn gì bạn cũng muốn sort mảng. Cách nhanh và an toàn nhất là dùng function sort chuẩn:
int[] grades = { 4, 3, 5, 2, 5 };
// Sắp xếp tăng dần
Array.Sort(grades);
Console.WriteLine("Điểm đã sắp xếp: " + string.Join(", ", grades));
Function này cũng sort được string, nhưng theo alphabet.
Sắp xếp giảm dần
Mặc định Array.Sort chỉ sort tăng dần. Muốn sort giảm dần thì sort xong đảo ngược:
Array.Sort(grades); // Đầu tiên sort tăng dần
Array.Reverse(grades); // Sau đó đảo ngược
Console.WriteLine("Giảm dần: " + string.Join(", ", grades));
Lưu ý: nhiều bạn hay quên là sort là “in-place”: mảng bị thay đổi, không trả về mảng mới đâu. Nếu cần giữ mảng gốc, nhớ clone trước.
7. Clone mảng: Clone và Array.Copy
Nếu muốn tạo bản sao (và không làm hỏng mảng gốc khi xử lý), dùng method Clone() và Array.Copy().
Method Clone() gọi trực tiếp trên mảng, trả về bản sao đầy đủ.
Method Array.Copy() thì cần truyền vào:
- mảng nguồn;
- mảng đích để copy;
- số lượng phần tử cần copy.
int[] original = { 1, 2, 3, 4, 5 };
// Cách 1: Clone()
// Dùng cho cả mảng 1 chiều và đa chiều, nhưng trả về object, cần ép kiểu:
int[] copy1 = (int[]) original.Clone();
// Cách 2: Array.Copy
int[] copy2 = new int[original.Length];
Array.Copy(original, copy2, original.Length);
Lưu ý quan trọng: mảng kiểu primitive (int, double) thì copy theo giá trị. Nếu là mảng object, chỉ copy reference thôi! (gọi là “sao chép nông”).
8. Điền giá trị cho mảng: Array.Fill
Muốn “reset” mảng hoặc điền toàn số 5? Có method tiện là Array.Fill:
int[] grades = new int[5];
Array.Fill(grades, 5); // Giờ tất cả phần tử đều là 5
Console.WriteLine("Sinh viên lý tưởng: " + string.Join(", ", grades));
Rất hữu ích khi cần khởi tạo mảng với giá trị nhất định.
9. Tìm giá trị lớn nhất và nhỏ nhất
Module System.Linq thêm cho mảng nhiều method hay, trong đó có Max() và Min() trả về giá trị lớn nhất/nhỏ nhất trong mảng.
Cùng tìm điểm cao nhất/thấp nhất trong mảng nhé:
int maxGrade = grades.Max();
int minGrade = grades.Min();
Console.WriteLine($"Điểm cao nhất: {maxGrade}, thấp nhất: {minGrade}");
Nhớ thêm using System.Linq; để dùng mấy method này nhé.
GO TO FULL VERSION