Trang chủ C# cơ bản Vòng lặp foreach trong C#

Vòng lặp foreach trong C#

Nguyễn Dương 07-06-2024

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.

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.

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
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
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.

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ử
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


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
for và foreach đều có ưu nhược điểm riêng của nó, tùy vào từng trường hợp mà sử dụng nhé.

Bài viết liên quan

Hàm đệ quy trong C# Hàm đệ quy trong C#
enum trong C# enum trong C#
Struct trong C# Struct trong C#
Lớp String trong C# Lớp String trong C#
Vòng lặp foreach trong C# Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C# Mảng đa chiều, mảng của mảng trong C#