Trong bài viết này, chúng ta sẽ cùng tìm hiểu về vòng lặp Foreach trong lập trình C#.
Foreach là một cấu trúc lặp đơn giản, rõ ràng để lặp qua các phần tử trong một mảng hoặc bất kỳ một Enumerable Collection.
#1/5: Cú pháp của vòng lặp foreach:
foreach (<kiểu dữ liệu> <tên biến tạm> in <tên mảng hoặc tập hợp>) { // code xử lý... }
Trong đó:
- foreach, in là từ khoá.
- <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> đạ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> cần duyệt.
#2/5: Một số đặc trưng của foreach
- Foreach không duyệt mảng hoặc tập hợp thông qua chỉ mục của phần tử như cấu trúc lặp for().
- Foreach duyệt tuần tự qua các phần tử trong mảng hoặc tập hợp.
- Việc thay đổi giá trị của biến lặp (<biến tạm>) là không được phép.
#3/5: Nguyên tắc hoạt động của foreach
- Ở vòng lặp đầu tiên sẽ gán giá trị của phần tử đầu tiên trong mảng vào biến tạm.
- Thực hiện khối lệnh bên trong vòng lặp foreach.
- Qua mỗi vòng lặp tiếp theo sẽ thực hiện kiểm tra xem đã duyệt hết mảng hoặc tập hợp chưa. Nếu chưa thì tiếp gán giá trị của phần tử hiện tại vào biến tạm và tiếp tục thực hiện khối lệnh bên trong.
- Khi đã duyệt qua hết các phần tử thì vòng lặp sẽ kết thúc.
#4/5: Ví dụ minh họa foreach làm việc với mảng và tập hợp
– Đối với mảng một chiều, câu lệnh foreach xử lý các phần tử theo thứ tự chỉ mục tăng dần, bắt đầu bằng phần tử ở vị trí index 0 và kết thúc bằng index (Length – 1):
int[] arrNumber1D = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; foreach (int i in arrNumber1D) { System.Console.Write("{0} ", i); } // Output: 4 5 6 1 2 3 -2 -1 0
Xem thêm: Kiểu mảng array trong lập trình C#.
– Đối với mảng nhiều chiều, các phần tử được di chuyển theo thứ tự của chỉ số ngoài cùng bên phải, sau đó là chỉ mục bên trái và sau đó là chỉ mục ngoài cùng bên trái:
// Khai báo mảng 2 chiều: 3 hàng, 2 cột int[,] arrNumber2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } }; // Hoặc ngắn gọn: // int[,] arrNumber2D = { { 9, 99 }, { 3, 33 }, { 5, 55 } }; foreach (int i in arrNumber2D) { System.Console.Write("{0} ", i); } // Output: 9 99 3 33 5 55
※ Tuy nhiên, với các mảng nhiều chiều, việc sử dụng các vòng lặp for() lồng nhau sẽ cho phép bạn kiểm soát, xử lý dễ dàng hơn thứ tự của các phần tử mảng.
– Sử dụng foreach để duyệt mảng jagged
int[][] JaggedArray = { new int[] { 1, 2, 3 }, new int[] { 5, 2, 4, 1, 6}, new int[] { 7, 3, 4, 2, 1, 5, 9, 8} }; // Tương tự như dùng for(), // chúng ta cũng dùng 2 vòng foreach lồng vào nhau để duyệt mảng. foreach (int[] elements in JaggedArray) { foreach (int item in elements) { Console.Write(item + " "); } Console.WriteLine(); } // Output: // 1 2 3 // 5 2 4 1 6 // 7 3 4 2 1 5 9 8
Xem thêm: Jagged Array trong lập trình C#.
– Làm việc với tập hợp, sử dụng foreach để in danh sách sinh viên từ danh sách các sinh viên:
using System; using System.Collections.Generic; namespace MinhHoangBlog { class SinhVien { public string tenSinhVien { get; set; } public int tuoi { get; set; } } class Program { static void Main(string[] args) { // Khai báo collection List sinh viên List<SinhVien> listSinhVien = new List<SinhVien>(); SinhVien sv1 = new SinhVien(); sv1.tenSinhVien = "Bùi Tiến Dũng"; sv1.tuoi = 20; listSinhVien.Add(sv1); SinhVien sv2 = new SinhVien(); sv2.tenSinhVien = "Lương Xuân Trường"; sv2.tuoi = 21; listSinhVien.Add(sv2); SinhVien sv3 = new SinhVien(); sv3.tenSinhVien = "Nguyễn Công Phượng"; sv3.tuoi = 22; listSinhVien.Add(sv3); // Sử dụng foreach lặp qua các phần tử của collection List foreach (SinhVien sv in listSinhVien) { Console.WriteLine($"{sv.tenSinhVien}, {sv.tuoi}"); } } } } // Output: // Bui Tien Dung, 20 // Luong Xuan Truong, 21 // Nguyen Cong Phuong, 22
Xem thêm: Làm việc với Collection và Generic trong C#.
#5/5: So sánh for và foreach trong C#
Tiêu chí | For | Foreach |
Khả năng truy xuất phần tử | Thay đổi được giá trị của các phần tử | Duyệt mảng, tập hợp khi không biết được số lượng phần tử |
Truy xuất ngẫu nhiên, có thể gọi bất kỳ phần nào trong mảng / tập hợp để sử dụng. | Có | Không |
Truy xuất tuần tự, chỉ có thể sử dụng được giá trị của phần tử đang xét. | Không | Có |