CodeGym /Các khóa học /C# SELF /Các thao tác cơ bản với mảng một chiều

Các thao tác cơ bản với mảng một chiều

C# SELF
Mức độ , Bài học
Có sẵn

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ố
arr[n] = x
Lỗi nếu vượt biên
Tìm giá trị
Array.IndexOf(arr, v)
-1 nếu không tìm thấy
Kiểm tra tồn tại
Array.Exists(arr, pred)
Lambda hoặc function
Sắp xếp
Array.Sort(arr)
Mảng thay đổi trực tiếp
Đảo ngược
Array.Reverse(arr)
Đổi thứ tự phần tử
Sao chép
arr.Clone(), Array.Copy
Sao chép nông
Điền giá trị
Array.Fill(arr, val)
Điền cùng một giá trị
Thay đổi kích thước
Array.Resize(ref arr, len)
Phần tử mới — default
Tìm max/min
arr.Max(), arr.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]);
Đọc và thay đổi phần tử mảng theo chỉ số

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);
} 
Tìm tất cả vị trí phần tử bằng Array.IndexOf

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);
}
Tìm tất cả vị trí phần tử từ cuối bằng Array.LastIndexOf

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}");
Kiểm tra giá trị có trong mảng bằng Contains

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));
Đảo mảng bằng Array.Reverse

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));
Sắp xếp mảng tăng dần bằng Array.Sort

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));
Sắp xếp giảm dần: Sort + Reverse

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: CloneArray.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()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);
Clone mảng: Clone()Array.Copy()

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));
Điền giá trị cho mảng bằng Array.Fill

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()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}");
Tìm giá trị lớn nhất và nhỏ nhất trong mảng

Nhớ thêm using System.Linq; để dùng mấy method này nhé.

2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Sắp xếp mảng và tìm phần tử lớn nhất
Sắp xếp mảng và tìm phần tử lớn nhất
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Tìm tất cả vị trí xuất hiện của phần tử trong mảng
Tìm tất cả vị trí xuất hiện của phần tử trong mảng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION