Mảng (Array) Trong C# – Nguyễn Anh Tuấn

Khái niệm về mảng

  •  Tập hợp các đối tượng có cùng kiểu dữ liệu.
  •  Mỗi đối tượng trong mảng được gọi là một phần tử.
  •  Các phần tử phân biệt với nhau bằng chỉ số phần tử. Trong C# chỉ số phần tử là các số nguyên không âm và bắt đầu từ 0 1 2 3…

Đặc điểm của mảng

  •  Các phần tử trong mảng dùng chung một tên và được truy xuất thông qua chỉ số phần tử.
  •  Một mảng cần có giới hạn số phần tử mà mảng có thể chứa.
  •  Phải cấp phát vùng nhớ mới có thể sử dụng mảng.
  •  Vị trí ô nhớ của các phần tử trong mảng được cấp phát liền kề nhau.

Tại sao phải sử dụng mảng?

Một mảng lưu giữ một tập hợp các phần tử có kích cỡ cố định trong cùng kiểu. Một mảng được sử dụng để lưu giữ một tập hợp dữ liệu, nhưng nó thường hữu ích hơn khi nghĩ về một mảng như là một tập hợp các biến cùng kiểu được lưu giữ tại các vị trí bộ nhớ kề nhau.

Thay vì khai báo biến một cách rời rạc, như biến number0, number1,… và number99, bạn có thể khai báo một mảng các giá trị như numbers[0], numbers[1] và … numbers[99] để biểu diễn các giá trị riêng biệt. Một thành viên cụ thể của mảng có thể được truy cập qua index (chỉ số).

Những lợi ích khi sử dụng mảng:

  • Gom nhóm các đối tượng có chung tính chất lại với nhau giúp code gọn gàng hơn.
  • Để thao tác, dễ quản lý, nâng cấp sửa chữa. Vì lúc này việc thay đổi số lượng sinh viên ta chỉ cần thay đổi số phần tử của mảng là được.
  • Dễ dàng áp dụng các cấu trúc lặp vào để xử lý dữ liệu.

Tất cả mảng đều bao gồm các vị trí nhớ liền kề nhau. Địa chỉ thấp nhất tương ứng với thành viên đầu tiền và địa chỉ cao nhất tương ứng với thành viên cuối cùng của mảng.

Mảng (Array) trong C#

Có bao nhiêu loại mảng?

  • Mảng 1 chiều
  • Mảng đa chiều: có 2 loại mảng đa chiều

– Mảng đa chiều cùng kích thước (Rectangular Array): 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 (Jagged Array): Trong mảng này các dòng có thể không cùng kích thước với nhau.

Mảng 1 chiều trong C#

Cú pháp khai báo:

<kiểu dữ liệu> [] <tên mảng>;

Trong đó:

  • <kiểu dữ liệu> là kiểu dữ liệu của các phần tử trong mảng.
  • Cặp dấu [] là ký hiệu cho khai báo mảng 1 chiều.
  • <tên mảng> là tên của mảng, cách đặt tên mảng cũng như cách đặt tên biến

Để sử dụng được mảng ta phải khởi tạo giá trị hoặc cấp phát vùng nhớ cho mảng. Cấp phát vùng nhớ:

  • Mảng là một kiểu tham chiếu, vì thế bạn cần sử dụng từ khóa new trong C# để tạo một Instance (sự thể hiện) của mảng đó. Lưu ý là khi cấp phát vùng nhớ cho mảng 1 chiều ta cần chỉ ra số phần tử tối đa của mảng.

Ví dụ:

string[] names = new string[10];

Sau khi mảng được cấp phát vùng nhớ thì các phần tử trong mảng sẽ mang giá trị mặc định:

  • Đối với số nguyên là 0
  • Đối với số thực là 0.0
  • Đối với kiểu ký tự là ‘’ (ký tự rỗng)
  • Đối với kiểu tham chiếu là null

Chúng ta có thể khởi tạo giá trị khác mà chúng ta mong muốn ngay khi cấp phát vùng nhớ bằng cú pháp sau:

<kiểu dữ liệu>[] <tên mảng> = new <kiểu dữ liệu>[] { <giá trị 1>, …, <giá trị n> };

  • Các giá trị khởi tạo nằm trong cặp dấu ngoặc ngọn {} và cách nhau bởi dấu phẩy.
  • Chúng ta không cần cung cấp số phần tử tối đa mà trình biên dịch sẽ tự đếm xem bạn đã khởi tạo bao nhiêu giá trị và xem nó như số phần tử tối đa. Vì thế dù việc khai báo số phần tử tối đa không lỗi nhưng trong trường hợp này nó không có ý nghĩa lắm!

Khởi tạo giá trị:

Cú pháp:

<kiểu dữ liệu>[] <tên mảng> = { <giá trị 1>, …, <giá trị n> };

Khai báo và cấp phát vùng nhớ

string[] Array = new string[3];

Khai báo, cấp phát và khởi tạo giá trị cho mảng

string[] names = new string[] { “Nguyen”, “Tuan” };

Khởi tạo giá trị cho mảng

int[] IntArray = { 3, 9, 10 };

Sao chép một biến mảng vào trong biến mảng mục tiêu khác

int [] marks = new int[] { 99, 98, 92, 97, 95}; int[] score = marks;

Trong tình huống này, cả biến mục tiêu và biến nguồn đều trỏ tới cùng vị trí bộ nhớ

Sử dụng mảng

Kiểu mảng có thể dùng làm:

  • Kiểu dữ liệu cho biến.
  • Kiểu trả về cho hàm.
  • Tham số truyền vào cho hàm.
    •  Các phần tử của mảng được truy xuất thông qua chỉ số phần tử và cặp dấu []. Có thể xem các phần tử của mảng như là các biến đơn và thao tác như thao tác với biến bình thường.

Thuộc tính và phương thức đặc trưng của mảng 1 chiều:

Tên thuộc tính hoặc phương thức Ý nghĩa
Length Thuộc tính trả về số nguyên kiểu int là số phần tử tối đa của mảng
LongLength Thuộc tính trả về số nguyên kiểu long là số phần tử tối đa của mảng
GetLength(<số chiều>) Trả về số nguyên kiểu int là số phần tử trong chiều đã xác định. Lưu ý chiều của mảng là các số nguyên và được đánh số từ 0. Cho nên đối với mảng 1 chiều thì số chiều là 0.
GetLongLength(<số chiều>) Tương tự GetLength nhưng trả về số nguyên kiểu long
Sort() Phương thức thực hiện sắp xếp mảng theo một thứ tự
Clear() Phương thức xóa hết dữ liệu trong mảng và đưa về giá trị mặc định của kiểu. Lưu ý là chỉ xóa giá trị, vùng nhớ vẫn còn đó và có thể tiếp tục sử dụng mà không cần cấp phát.
Copy() Thực hiện copy giá trị của mảng ra một vùng nhớ mới (phép gán thông thường thì 2 đối tượng sẽ dùng chung vùng nhớ rất nguy hiểm vì đối tượng này thay đổi dẫn đến đối tượng kia cũng thay đổi)
Reverse() Phương thức thực hiện đảo ngược thứ tự của mảng 1 chiều

Truy cập các phần tử mảng trong C#

Một phần tử được truy cập bởi chỉ mục mảng. Điều này được thực hiện bởi việc đặt chỉ số của phần tử bên trong dấu ngoặc vuông ở sau tên mảng. Ví dụ:

double salary = balance[9];

Ví dụ sau minh họa khái niệm về khai báo, gán và truy cập mảng trong C# đã đề cập ở trên

1.PNG

Sử dụng vòng lặp foreach trong C#

2.PNG

Mảng 2 chiều trong C#

Mảng 2 chiều được hình dung như một bảng có m dòng và n cột với một số đặc trưng sau:

  • Mảng 2 chiều mang những đặc trưng cơ bản của một mảng bình thường.
  • Các phần tử trong mảng 2 chiều được truy xuất thông qua 2 chỉ số phần tử (tạm gọi là chỉ số dòng và chỉ số cột)

Mảng hai chiều trong C#

Như vậy, mỗi phần tử trong mảng a được định danh bởi một tên phần tử trong kiểu mẫu a[i][j], với a là tên mảng và i, j là các subscript – chỉ số được xác định duy nhất mỗi phần tử trong a.

Cú pháp:

<kiểu dữ liệu> [ , ] <tên mảng>;

Trong đó:

  • <kiểu dữ liệu> là kiểu dữ liệu của các phần tử trong mảng.
  • Cặp dấu [ , ] là ký hiệu cho khai báo mảng 2 chiều.
  • <tên mảng> là tên của mảng, cách đặt tên mảng cũng như cách đặt tên biến

Để sử dụng được mảng ta phải khởi tạo giá trị hoặc cấp phát vùng nhớ cho mảng.

Cấp phát vùng nhớ

Được thực hiện thông qua toán tử new. Lưu ý là khi cấp phát vùng nhớ cho mảng 2 chiều ta cần chỉ ra số dòng và số cột tối đa của mảng.

Ví dụ:

int[,] grid= new int[2, 3];

Chúng ta có thể khởi tạo giá trị khác mà chúng ta mong muốn ngay khi cấp phát vùng nhớ bằng cú pháp sau:

<kiểu dữ liệu>[,] <tên mảng> = new <kiểu dữ liệu>[]

{

{ <giá trị dòng 1 cột 1>, …, <giá trị dòng 1 cột n> },

{ <giá trị dòng m cột 1>, …, <giá trị dòng m cột n> }

};

Hinh7_ProCSharp_Unit5_10112015.png

Truy cập các phần tử của mảng hai chiều trong C#

Các phần tử mảng hai chiều được truy cập bởi sử dụng các chỉ số, ví dụ chỉ số hàng và chỉ số cột. Ví dụ:

3.PNG

Mảng 3 chiều trong C#

Ngoài mảng 1 chiều và mảng 2 chiều ra thì C# còn hỗ trợ chúng ta khai báo và sử dụng mảng 3 chiều, 4 chiều thậm chí là n chiều tuỳ vào từng yêu cầu của bài toán.

Nếu như mảng 2 chiều được hình dung như là một ma trận MxN thì mảng 3 chiều được hình dung như một hình hộp chữ nhật có kích thước MxNxP.

Cú pháp:

<kiểu dữ liệu> [ , , ] <tên mảng>;

Trong đó:

  • <kiểu dữ liệu> là kiểu dữ liệu của các phần tử trong mảng.
  • Cặp dấu [ , , ] là ký hiệu cho khai báo mảng 3 chiều.
  • <tên mảng> là tên của mảng, cách đặt tên mảng cũng như cách đặt tên biến .

Để sử dụng được mảng ta phải khởi tạo giá trị hoặc cấp phát vùng nhớ cho mảng.

Cấp phát vùng nhớ

  • Được thực hiện tương tự như mảng 2 chiều nhưng cần chỉ ra 3 chỉ số cho mảng.

string[ , , ] names = new string[2, 2, 3];

Ví dụ:

4.PNG

Với khai báo trên thì Mang3Chieu sẽ là mảng 3 chiều với số phần tử tối đa của các chiều lần lượt là 2 2 3.

Jagged Array trong C#

Jaggaed Array là mảng có kích thước của các chiều có thể không bằng nhau, điều này khác với mảng đa chiều cùng kích thước. Nếu hình dạng của mảng đa chiều cùng kích thước có dạng hình chữ nhật thì hình dạng của mảng này không phải hình chữ nhật vì các chiều của chúng không điều nhau. Hình ảnh mô tả mảng đa chiều có kích cỡ khác nhau :

Hinh8_ProCSharp_Unit5_10112015.png

Bạn có thể khai báo một Jagged Array với tên scores với kiểu int, như sau:

int [][] scores;

Khai báo một mảng, không tạo mảng đó trong bộ nhớ. Để khai báo mảng như vậy:

int[][] scores = new int[5][]; for (int i = 0; i < scores.Length; i++) { scores[i] = new int[4]; }

Bạn có thể khởi tọa một Jagged Array trong C# như sau:

int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};

Dưới đây là ví dụ minh họa cách sử dụng một Jagged Array trong C#:

5.PNG

Truyền mảng như là các tham số hàm trong C#

Bạn có thể truyền một mảng như là một tham số hàm trong C#. Dưới đây là ví dụ minh họa khái niệm này:

 6.PNG Mảng tham số trong C#

Đôi khi, trong khi khai báo một phương thức, bạn không chắc chắn số tham số được truyền như là một tham số. Mảng tham số (Parameter Array) trong C# giúp giải quyết vấn đề này.

Dưới đây là ví dụ minh họa mảng tham số trong C#: bạn tạo hai lớp có tên lần lượt là MangThamSo và TestCsharp như sau:

Lớp MangThamSo: có chứa phương thức CongPhanTu()

7.PNG

Lớp TestCsharp: có chứa phương thức main() để thao tác trên đối tượng MangThamSo.

8.PNG

Share this:

  • Twitter
  • Facebook
Like Loading...

Related

Từ khóa » Gán Giá Trị Cho Mảng C#