Chúng ta đã cùng nhau đi qua các bài về mảng, mảng 1 chiều, mảng 2 chiều, mảng đa chiều, mảng jagged. Trong các bài đó, mình đã lấy một số ví dụ về duyệt mảng và thường sử dụng vòng lặp for để thao tác. Nhưng trong C#, có hỗ trợ người dùng 1 vòng lặp chuyên chỉ để duyệt mảng, đó là vòng lặp foreach.
1. CẤU TRÚC LẶP FOREACH TRONG C#
foreach giúp chúng ta duyệt 1 mảng hoặc 1 tập hợp trong chương trình.
Cú pháp:
foreach (<kiểu dữ liệu> <tên biến tạm> in <tên mảng hoặc tập hợp>)
{
//Khối lệnh xử lý
}
Trong đó:
- foreach, in là từ khoá bắt buộc.
- kiểu dữ liệu là kiểu dữ liệu của các phần tử trong mảng hoặc tập hợp.
- tên biến tạm là tên 1 biến tạm đại diện cho phần tử đang xét khi duyệt mảng hoặc tập hợp.
- tên mảng hoặc tập hợp là tên của mảng hoặc tập hợp cần duyệt.
- foreach, in là từ khoá bắt buộc.
- kiểu dữ liệu là kiểu dữ liệu của các phần tử trong mảng hoặc tập hợp.
- tên biến tạm là tên 1 biến tạm đại diện cho phần tử đang xét khi duyệt mảng hoặc tập hợp.
- tên mảng hoặc tập hợp là tên của mảng hoặc tập hợp cần duyệt.
Nguyên lý hoạt động:
- Vòng lặp đầu tiên, gán giá trị của phần tử đầu tiên trong mảng vào biến tạm.
- Thực thi khối lệnh trong thân vòng lặp.
- Tiếp tục gán giá trị của phần tử thứ 2 vào biến tạm rồi thực thi khối lệnh.
- Cứ tiếp tục như vậy với phần tử thứ 3, 4, 5 ....... cho đến hết mảng thì kết thúc.
Qua nguyên lý hoạt động, ta có thể thấy:
- foreach duyệt tuần tự các phần tử trong mảng từ phần tử đầu tiên đến phần tử cuối cùng.
- Tại một thời điểm, chỉ có thể thao tác với giá trị của phần tử đang xét mà không thể tương tác với các phần tử đứng trước nó hay đứng sau nó.
- Không thể thay đổi giá trị của các phần tử vì lúc này giá trị của nó đã được sao chép ra một 1 biến tạm và ta chỉ có thể thao tác với biến tạm.
- Nếu cố thay đổi giá trị của biến tạm sẽ gây ra lỗi.
- Thực thi khối lệnh trong thân vòng lặp.
- Tiếp tục gán giá trị của phần tử thứ 2 vào biến tạm rồi thực thi khối lệnh.
- Cứ tiếp tục như vậy với phần tử thứ 3, 4, 5 ....... cho đến hết mảng thì kết thúc.
Qua nguyên lý hoạt động, ta có thể thấy:
- foreach duyệt tuần tự các phần tử trong mảng từ phần tử đầu tiên đến phần tử cuối cùng.
- Tại một thời điểm, chỉ có thể thao tác với giá trị của phần tử đang xét mà không thể tương tác với các phần tử đứng trước nó hay đứng sau nó.
- Không thể thay đổi giá trị của các phần tử vì lúc này giá trị của nó đã được sao chép ra một 1 biến tạm và ta chỉ có thể thao tác với biến tạm.
- Nếu cố thay đổi giá trị của biến tạm sẽ gây ra lỗi.
2. CÁCH SỬ DỤNG FOREACH
Xét các ví dụ sau
Ví dụ 1: Duyệt với mảng 1 chiều
Ví dụ 1: Duyệt với mảng 1 chiều
int sum = 0;
int[] ArrayC = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (int item in ArrayC)
{
Console.Write("{0,3}", item);
sum += item;
}
Console.WriteLine();
Console.WriteLine("Tổng các giá trị phần tử trong mảng ArrayC là: " + sum);
Kết quả sẽ hiện các giá trị phần tử ra màn hình và tổng của chúng là 45.
Ví dụ 2: Duyệt với mảng 3 chiều
Ví dụ 2: Duyệt với mảng 3 chiều
int sum = 0;
int[,,] ArrayC =
{
{
{1,2,3},
{1,2,3},
{1,2,3}
},
{
{1,2,3},
{1,2,3},
{1,2,3}
}
};
foreach (int item in ArrayC)
{
Console.Write("{0,3}", item);
sum += item;
}
Console.WriteLine();
Console.WriteLine("Tổng các giá trị phần tử trong mảng ArrayC là: " + sum);
Kết quả tổng các giá trị sẽ là 36.
Qua 2 ví dụ trên, ta có thể thấy, thao tác với foreach sẽ ngắn gọn hơn rất nhiều so với vòng lặp for.
Qua 2 ví dụ trên, ta có thể thấy, thao tác với foreach sẽ ngắn gọn hơn rất nhiều so với vòng lặp for.
Ví dụ 3: Duyệt với mảng jagged
int sum = 0;
int[][] ArrayC =
{
new int [] {1,2,3},
new int [] {1,2,3},
new int [] {1,2,3}
};
foreach (int[] element in ArrayC)
{
foreach (int item in element)
{
Console.Write("{0,3}", item);
sum += item;
}
}
Console.WriteLine();
Console.WriteLine("Tổng các giá trị phần tử trong mảng ArrayC là: " + sum);
Qua ví dụ này ta thấy, kể cả duyệt với mảng jagged thì dùng foreach sẽ ngắn gọn hơn rất nhiều so với for.
Lưu ý trong vòng lặp foreach đầu, phần kiểu dữ liệu phải là kiểu mảng nhé (int [ ]). Vì mỗi phần tử trong mảng jagged lại là một mảng dữ liệu.
3. SO SÁNH FOR VÀ FOREACH
Qua các ví dụ trên, bạn sẽ thấy foreach duyệt nhanh và code ngắn gọn hơn for rất nhiều nhưng lưu ý foreach chỉ chiếm ưu thế khi duyệt mảng hoặc tập hợp và thường chỉ dùng để duyệt mảng hoặc tập hợp.Tiêu chí | Vòng lặp for | Vòng lặp foreach |
Khả năng truy xuất phần tử | Truy xuất bất kỳ phần tử nào | Chỉ truy xuất theo thứ tự |
Thay đổi giá trị phần tử | Có | Không |
Duyệt mảng, tập hợp khi không rõ số lượng phần tử của mảng, tập hợp | Không | Có |
Hiệu suất xử lý | Tốt hơn đối với mảng, tập hợp có khả năng truy xuất ngẫu nhiên | Tốt hơn đối với mảng, tập hợp không có khả năng truy xuất ngẫu nhiên |
Bài viết liên quan
Hàm đệ quy trong C#
enum trong C#
Struct trong C#
Lớp String trong C#
Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C#