Ngôn Ngữ Lập Trình C# Phương thức có thể xem mảng này như thể một mảng được tạo ra tường minh và được truyền vào tham số. Sau đó chúng ta có thể tự do lặp lần lượt qua các thành phần trong mảng giống như thực hiện với bất cứ mảng nguyên nào khác: foreach (int i in intVals) { Console.WriteLine(“DisplayVals: {0}”, i); } Tuy nhiên, phương thức gọi không cần thiết phải tạo tường minh một mảng, nó chỉ đơn giản truyền vào các số nguyên, và trình biên dịch sẽ kết hợp những tham số này vào trong một mảng cho phương thức DisplayVals, ta có thể gọi phương thức như sau: t.DisplayVals(5,6,7,8); và chúng ta có thể tự do tạo một mảng để truyền vào phương thức nếu muốn: int [] explicitArray = new int[5] {1,2,3,4,5}; t.DisplayArray(explicitArray); Ví dụ 9.3 cung cấp tất cả mã nguồn để minh họa sử dụng cú pháp params. Ví dụ 9.3: minh họa sử dụng params. namespace Programming_CSharp { using System; public class Tester { static void Main() { Tester t = new Tester(); t.DisplayVals(5,6,7,8); int[] explicitArray = new int[5] {1,2,3,4,5}; t.DisplayVals(explicitArray); } public void DisplayVals( params int[] intVals) { foreach (int i in intVals) { Console.WriteLine(“DisplayVals {0}”, i); } } } } Mảng, Chỉ Mục, và Tập Hợp 218 . . Ngôn Ngữ Lập Trình C# Kết quả: DisplayVals 5 DisplayVals 6 DisplayVals 7 DisplayVals 8 DisplayVals 1 DisplayVals 2 DisplayVals 3 DisplayVals 4 DisplayVals 5 Câu lệnh lặp foreach Câu lệnh lặp foreach khá mới với những người đã học ngôn ngữ C, từ khóa này được sử dụng trong ngôn ngữ Visual Basic. Câu lệnh foreach cho phép chúng ta lặp qua tất cả các mục trong một mảng hay trong một tập hợp. Cú pháp sử dụng lệnh lặp foreach như sau: foreach (<kiểu dữ liệu thành phần> <tên truy cập> in <mảng/tập hợp> ) { // thực hiện thông qua <tên truy cập> tương ứng với // từng mục trong mảng hay tập hợp } Do vậy, chúng ta có thể cải tiến ví dụ 9.1 trước bằng cách thay việc sử dụng vòng lặp for bằng vòng lặp foreach để truy cập đến từng thành phần trong mảng. Ví dụ 9.2: Sử dụng foreach. namespace Programming_CSharp { using System; // tạo một lớp đơn giản để lưu trữ trong mảng public class Employee { // bộ khởi tạo lấy một tham số public Employee( int empID ) { this.empID = empID; } Mảng, Chỉ Mục, và Tập Hợp 219 . . Ngôn Ngữ Lập Trình C# public override string ToString() { return empID.ToString(); } // biến thành viên private private int empID; private int size; } public class Tester { static void Main() { int[] intArray; Employee[] empArray; intArray = new int[5]; empArray = new Employee[3]; // tạo đối tượng đưa vào mảng for( int i = 0; i < empArray.Length; i++) { empArray[i] = new Employee(i+10); } // xuất mảng nguyên foreach (int i in intArray) { Console.Write(i.ToString()+”\t”); } // xuất mảng Employee foreach ( Employee e in empArray) { Console.WriteLine(e.ToString()+”\t”); } } } } Kết quả của ví dụ 9.2 cũng tương tự như ví dụ 9.1. Tuy nhiên, với việc sử dụng vòng lặp for ta phải xác định kích thước của mảng, sử dụng biến đếm tạm thời để truy cập đến từng thành phần trong mảng: Mảng, Chỉ Mục, và Tập Hợp 220 . . Ngôn Ngữ Lập Trình C# for (int i = 0 ; i < empArray.Length; i++) { Console.WriteLine(empArray[i].ToString()); } Thay vào đó ta sử dụng foreach , khi đó vòng lặp sẽ tự động trích ra từng mục tuần tự trong mảng và gán tạm vào một tham chiếu đối tượng khai báo ở đầu vòng lặp: foreach ( Employee e in empArray) { Console.WriteLine(e.ToString()+”\t”); } Đối tượng được trích từ mảng có kiểu dữ liệu tương ứng. Do đó chúng ta có thể sử dụng bất cứ thành viên public của đối tượng. Mảng đa chiều Từ đầu chương đến giờ chúng ta chỉ nói đến mảng các số nguyên hay mảng các đối tượng. Tất cả các mảng này đều là mảng một chiều. Mảng một chiều trong đó các thành phần của nó chỉ đơn giản là các đối tượng kiểu giá trị hay đối tượng tham chiếu. Mảng có thể được tổ chức phức tạp hơn trong đó mỗi thành phần là một mảng khác, việc tổ chức này gọi là mảng đa chiều. Mảng hai chiều được tổ chức thành các dòng và cột, trong đó các dòng là được tính theo hàng ngang của mảng, và các cột được tính theo hàng dọc của mảng. Mảng ba chiều cũng có thể được tạo ra nhưng thường ít sử dụng do khó hình dung. Trong mảng ba chiều những dòng bây giờ là các mảng hai chiều. Ngôn ngữ C# hỗ trợ hai kiểu mảng đa chiều là: Mảng đa chiều cùng kích thước: trong mảng này mỗi dòng trong mảng có cùng kích thước với nhau. Mảng này có thể là hai hay nhiều hơn hai chiều. Mảng đa chiều không cùng kích thước: trong mảng này các dòng có thể không cùng kích thước với nhau. Mảng đa chiều cùng kích thước Mảng đa chiều cùng kích thước còn gọi là mảng hình chữ nhật (rectanguler array). Trong mảng hai chiều cổ điển, chiều đầu tiên được tính bằng số dòng của mảng và chiều thứ hai được tính bằng số cột của mảng. Để khai báo mảng hai chiều, chúng ta có thể sử dụng cú pháp theo sau: <kiểu dữ liệu> [,] <tên mảng> Ví dụ để khai báo một mảng hai chiều có tên là myRectangularArray để chứa hai dòng và ba cột các số nguyên, chúng ta có thể viết như sau: int [ , ] myRectangularArray; Mảng, Chỉ Mục, và Tập Hợp 221 . . Ngôn Ngữ Lập Trình C# Ví dụ tiếp sau đây minh họa việc khai báo, tạo thể hiện, khởi tạo và in nội dung ra màn hình của một mảng hai chiều. Trong ví dụ này, vòng lặp for được sử dụng để khởi tạo các thành phần trong mảng. Ví dụ 9.4: Mảng hai chiều. namespace Programming_CSharp { using System; public class Tester { static void Main() { // khai báo số dòng và số cột của mảng const int rows = 4; const int columns = 3; // khai báo mảng 4x3 số nguyên int [,] rectangularArray = new int[rows, columns]; // khởi tạo các thành phần trong mảng for(int i = 0; i < rows; i++) { for(int j = 0; j < columns; j++) { rectangularArray[i,j] = i+j; } } // xuất nội dung ra màn hình for(int i = 0; i < rows; i++) { for(int j = 0; j < columns; j++) { Console.WriteLine(“rectangularArray[{0},{1}] = {2}”, i, j, rectangularArray[i, j]); } } } } } Mảng, Chỉ Mục, và Tập Hợp 222 . . . nhiên, phương thức gọi không cần thiết phải tạo tường minh một mảng, nó chỉ đơn giản truyền vào các số nguyên, và trình biên dịch sẽ kết hợp những tham số này vào trong một mảng cho phương thức. nguyên hay mảng các đối tượng. Tất cả các mảng này đều là mảng một chiều. Mảng một chiều trong đó các thành phần của nó chỉ đơn giản là các đối tượng kiểu giá trị hay đối tượng tham chiếu. Mảng. empArray) { Console.WriteLine(e.ToString()+” ”); } Đối tượng được trích từ mảng có kiểu dữ liệu tương ứng. Do đó chúng ta có thể sử dụng bất cứ thành viên public của đối tượng. Mảng đa chiều Từ đầu chương đến