Dữ liệu mảng trong C# 5.0 - Visual Studio 2015 – Bài 5

Dữ liệu mảng trong C# 5.0 - Visual Studio 2015 – Bài 5
access_time 11/11/2015 1:26:40 PM
person Nguyễn Mạnh Hùng
1. Dữ liệu mảng
1.1 Giới thiệu dữ liệu mảng
Theo cách nhìn truyền thống thì một mảng là một tập hợp các phần tử liên tiếp có đặc trưng như sau :
  • Tất cả các phần tử trong mảng có cùng kiểu dữ liệu
  • Các phần tử được lưu trữ tại các địa chỉ bộ nhớ liền kề nhau.
  • Mỗi phần tử trong mảng được truy vấn thông qua chỉ số phần tử của mảng. Chỉ số mảng có kiểu số nguyên dương.
  • Chỉ số phần tử đầu tiên của mảng có giá trị là 0, chỉ số phần tử thứ n của mảng có giá trị là n-1.
Ví dụ : Mảng các số nguyên có 8 phần tử với giá trị lưu trữ từ 10 đến 80.
Hình số 1 :  Mảng các số nguyên có 8 phần tử
1.2 Khai báo dữ liệu mảng.
Dữ liệu của mảng có kiểu tham chiếu (Reference type), Khi một biến được khai báo có kiểu dữ liệu mảng cần phải xác định các thông tin như sau :
  • Kiểu dữ liệu của các phần tử mảng.
  • Số chiều của mảng (Mảng 1 chiều hay mảng nhiều chiều).
  • Tên của biến mảng.
Cú pháp
type[ ] name;
Mô tả
  • type : Kiểu dữ liệu mảng ví dụ int, char, …
  • name : Tên của mảng hay tên của biến mảng.
1.3 Khởi tạo mảng
Giá trị mặc định : Khi chúng ta tạo một mảng có kiểu dữ liệu giá trị, mỗi thành phần sẽ chứa giá trị mặc định của kiểu dữ liệu. Bảng dưới đây mô tả giá trị mặc định của một số kiểu dữ liệu.
Ví dụ :
Với khai báo:
myIntArray = new int[5];
Sẽ tạo ra một mảng năm số nguyên, và mỗi thành phần được thiết lập giá trị mặc định là 0, đây cũng là giá trị mặc định của số nguyên.
Không giống với mảng kiểu dữ liệu giá trị, những kiểu tham chiếu trong một mảng không
được khởi tạo giá trị mặc định. Thay vào đó, chúng sẽ được khởi tạo giá trị null. Nếu chúng ta cố truy cập đến một thành phần trong mảng kiểu dữ liệu tham chiếu trước khi chúng được khởi tạo giá trị xác định, chúng ta sẽ tạo ra một ngoại lệ.
 
Giả sử chúng ta tạo ra một lớp Student. Chúng ta khai báo một mảng các đối tượng Student với cú pháp sau:
Student [] students;
và chúng ta tạo thể hiện của mảng như sau:
students = new Student[3];
Chúng ta có thể viết ngắn gọn như sau:
Student students = new Student [3];
Không giống với ví dụ mảng số nguyên trước, câu lệnh này không tao ra một mảng với những tham chiếu đến ba đối tượng Student. Thay vào đó việc này sẽ tạo ra một mảng
students với ba tham chiếu null. Để sử dụng mảng này, đầu tiên chúng ta phải tạo và gán đối tượng Student cho từng thành phần tham chiếu trong mảng. Chúng ta có thể tạo đối tượng trong vòng lặp và sau đó gán từng đối tượng vào trong mảng.
Để khởi tạo mảng trong C#, lập trình viên có thể lựa chọn theo 2 cách, cách 1 sử dụng từ khóa new để cấp phát đối tượng, cách 2 không sử dụng từ khóa new, điều đó có nghĩa là lập trình viên sẽ phải thiết lập giá trị cho các phần tử ngay khi khai báo.
Mô tả cách 1, sử dụng để khai báo cấp phát các phần tử của mảng thông qua từ khóa new.
Cú pháp
type[] arrayName = new type[size-value];
Mô tả
  • type : Kiểu dữ liệu mảng ví dụ int, float…
  • arrayName : Tên mảng hoặc tên biến mảng
  • size-value : Kích cỡ mảng
Mô tả cách 2, không sử dụng từ khóa new để cấp phát đối tượng.
Cú pháp
type[ ] arrayIdentifier = {val1, val2, val3, ..., valN};
Mô tả
  • type : Kiểu dữ liệu mảng ví dụ int, float…
  • arrayIdentifier: Tên mảng hoặc tên biến mảng
  • val1: Giá trị phần tử thứ nhất của mảng, val2 Giá trị phần tử thứ 2 của mảng… valN giá trị của phần tử thứ N của mảng.
Ví dụ :
Khai báo 1 mảng số nguyên tên là thu có 4 phần tử theo cách số 1
int[] row  = new  int[4];
Hoặc khai báo 1 mảng kiểu char có 15 phần tử theo cách số 1
char[] rowChar = new  char[15];
 
Hình ảnh minh họa
Hình số 2 : Sử dụng new để cấp phát mảng
Khai báo 1 mảng chuỗi có chứa các phần tử kiểu string lưu trữ các thứ trong 1 tuần theo cách số 2.
int[] row= {1,2,3,4};
Hoặc
int[] row= new int[4]{1,2 ,3,4};
Hình ảnh minh họa.
Hình số 3 : Khởi tạo và thiết lập giá trị mảng
1.4 Truy vấn các phần tử mảng.
Các phần tử mảng được truy vấn thông qua chỉ số của mảng. Hình dưới đây mô tả truy vấn các phần tử của mảng 1 chiều và mảng 2 chiều.
Hình số 4 : Truy vấn các phần tử mảng thông qua chỉ số mảng


Ví dụ : Mô tả cách thức truy vấn và khởi tạo mảng nguyên 10 phần tử
Hình số 5 : Truy vấn và khởi tạo mảng
2. Các loại mảng
Căn cứ trên cách thức lưu trữ thông tin của mảng, mảng trong C# được chia làm 2 loại : Mảng một chiều và mảng đa chiều.
2.1 Mảng một chiều
Các phần tử của mảng một chiều được mô tả như một dòng, với số lượng phần tử tương ứng với kích cỡ của mảng khi khai báo. Các địa chỉ lưu trữ các phần tử của mảng được bố trí tuần tự và liên tiếp trên vùng bộ nhớ.
Trong mảng một chiều, nếu số lượng các phần tử là n thì các chỉ số của các phần tử của mảng được đánh số từ 0 (Phần tử đầu tiên) và n-1 (Phần tử thứ n). Ví dụ mảng một chiều có 7 phần tử thì chỉ số của các phần tử sẽ từ 0 đến 6.
Cú pháp khai báo mảng một chiều rất đơn giản :
Cú pháp
type[] arrayName; //Khai báo
arrayName = new type[length]; // Khởi tạo
Mô tả
  • type: Mô tả kiểu dữ liệu.
  • arrayName: Tên mảng hay còn gọi là biến mảng.
  • length: Số lượng các phần tử mảng.
  • new: từ khóa khởi tạo mảng.
Ví dụ : Xem lại ví dụ ở phần trên.
2.2 Mảng đa 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 (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 đa chiều cùng kích 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 2 cách:
Cách 1 : Khởi tạo mảng 2 chiều dùng toán tử new , sau đó thiết lập giá trị mảng 2 chiều thông qua vòng lặp for.
Cú pháp
type[,] <arrayName>; // Khai báo mảng
arrayName = new type[value1 , value2]; //Cấp phát giá trị mảng
Mô tả
  • type: Kiểu dữ liệu mảng.
  • arrayName: Tên mảng.
  • value1: Số phần tử mảng tính theo tổng số dòng.
  • value2: Số phần tử mảng tính theo tổng số cột.
Ví dụ: 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.
Hình số 6 : Khai báo, khởi tạo và in nội dung mảng 2 chiều
Cách 2 : Khởi tạo giá trị mảng 2 chiều ngay tại thời điểm khai báo mảng.
Cú pháp
type[,] <arrayName> = {{value1},{value2}…{value n}};
Mô tả
  • type: Kiểu dữ liệu mảng.
  • arrayName: Tên mảng.
  • value1: Tập hợp giá trị của mảng theo cấu trúc mảng 1 chiều.
  • value2: Tập hợp giá trị của mảng theo cấu trúc mảng 1 chiều.
  • value n: Tập hợp giá trị của mảng theo cấu trúc mảng 1 chiều.
Hình ảnh minh họa khởi tạo giá trị của mảng theo cách thứ 2.
Hình số 7 : Khai báo, khởi tạo mảng 2 chiều
Mảng đa chiều có kích khác nhau (Jagged 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 :
Hình số 8 : Mô tả mảng 2 chiều có kích cỡ khác nhau
 
Khi tạo một mảng đa chiều kích thước khác nhau thì lập trình viên cần phải khai báo số dòng trong mảng trước. Sau đó với mỗi dòng sẽ giữ một mảng, có kích thước bất kỳ. Những mảng này được khai báo riêng. Sau đó lập trình viên khởi tạo giá trị các thành phần trong những mảng bên trong.
Trong mảng này, mỗi chiều là một mảng một chiều. Để khai báo mảng đa chiều có kích thước khác nhau ta sử dụng cú pháp sau, khi đó số ngoặc chỉ ra số chiều của mảng:
Ví dụ
Khởi tạo mảng đa chiều có kích cỡ không bằng nhau, bao gồm số hàng 3, các phần tử của cột sẽ được cấp phát động.
 
Hình số 9 : Sử dụng mảng có kích cỡ không bằng nhau
Thông thường để thao tác được với mảng có kích cỡ bàng nhau, lập trình viên thường sử dụng cấu trúc lặp lồng nhau để thực hiện. Quá trình thực hiện thông qua 3 bước, các bước được mô tả chi tiết tại hình số 9.
3. Lớp mảng System.Array
Lớp mảng System.Array là lớp được Microsoft hỗ trợ sẵn bao gồm một tập hợp các phương thức , thuộc tính để thao tác với kiểu dữ liệu tập hợp.
3.1 Phương thức khởi tạo đối tượng
Lập trình viên sử dụng phương thức CreateInstance() để tạo mảng.
Cú pháp khởi tạo mảng 1 chiều.
Syntax:
public static Array CreateInstance(typeof(elementType), int length)
Mô tả
  • Array: Giá trị trả về được tham chiếu tới mảng được tạo.
  • elementType: Kiểu dữ liệu
  • length: Số lượng các phần tử cần cấp phát.
Cú pháp khởi tạo mảng đa chiều
Syntax:
public static Array CreateInstance(typeof(elementType), int length1, int
length2)
Mô tả
  • Array: Giá trị trả về được tham chiếu tới mảng được tạo.
  • elementType: Kiểu dữ liệu
  • length1: Số lượng các phần tử của dòng.
  • Length2: Số lượng các phần tử của cột.
Ví dụ : Ví dụ sau mô tả cách khởi tạo và duyệt các phần tử thông qua lớp Array.
Hình số 10 : Khởi tạo và duyệt các phần tử
3.2 Các phương thức thông dụng System.Array.
Lớp Array cung cấp các phương thức thông dụng sau đây để thao tác với mảng :
  • Phương thức Sort : Sử dụng để sắp xếp mảng
  • Phương thức Clear : Xóa các phần tử của mảng về các giá trị mặc định như 0 hoặc NULL.
  • Phương thức Clone : Tạo bản copy mảng
  • Phương thức GetLength : Trả về số lượng các phần tử theo từng chiều mảng.
  • Phương thức IndexOf: Trả về chỉ số Index của phần tử đầu tiên khi được tìm thấy.
Ví dụ : Sắp xếp một mảng số nguyên thông qua phương thức Sort của lớp System.Array
int[ ] data = {4,6,3,8,9,3}; // Dữ liệu chương được sắp xếp
System.Array.Sort(data); // Dữ liệu đã được sắp xếp.
vertical_align_top
share
Chat...