Như vậy là chúng ta đã hoàn thành bài học thứ 2 với các nội dung về biến, kiểu dữ liệu và các cấu trúc lệnh cơ bản trong C#. Bài học thứ 3 sẽ hướng dẫn các bạn những kỹ năng làm việc với mảng, xâu ký tự, enum, biểu thức chính tắc và cấu trúc.
Trong bài học thứ 3 của khoá học, chúng ta sẽ học những nội dung sau:
- Phần 1: Mảng (Array)
- Phần 2: Xâu ký tự (String)
- Phần 3: Biểu thức chính tắc (Regular Expression)
- Phần 4: Enum và cấu trúc trong C# (Structure)
- Phần 5: Bài tập thực hành và mã nguồn
Giới thiệu mảng
Mảng là 1 cấu trúc dữ liệu để lưu trữ 1 danh sách các phần tử có số lượng cố định và cùng kiểu dữ liệu theo thứ tự tuần tự. Hiểu theo cách đơn giản, mảng là 1 tập hợp các phần tử cùng kiểu và có số lượng các phần tử cố định.
Ví dụ, bạn muốn xử lý 100 biến số thì thay bằng bạn phải khai báo 100 biến có tên number0, number1, …, đến number99 thì bạn chỉ cần khai báo 1 biến tên là mảng tên là number và có thể chứa tham chiếu tới 100 biến số tương ứng là numbers[0], numbers[1], và …, numbers[99].
Tổng quan về mảng
Mảng trong C# có các thuộc tính sau:
- Số thứ nguyên và độ dài của mỗi thứ nguyên được thiết lập khi tạo phiên bản mảng. Không thể thay đổi các giá trị này trong suốt thời gian tồn tại của phiên bản.
- Giá trị mặc định của các phần tử mảng chứa các phần tử số được đặt là 0 và các phần tử tham chiếu được đặt là null.
- Chỉ số của mảng bắt đầu từ 0, một mảng có n phần tử được đánh chỉ số từ 0 đến n-1.
- Các phần tử của mảng có thể thuộc bất kỳ kiểu nào, kể cả kiểu mảng.
- Kiểu mảng là kiểu tham chiếu bắt nguồn từ kiểu lớp cơ sở trừu tượng Array.
- Bạn có thể sử dụng câu lệnh foreach để lặp qua một mảng.
Phân loại mảng
Trong C#, chúng ta có thể dùng các loại mảng như sau:
- Mảng một chiều (Single-Dimensional Array): Mảng một chiều trong C# là loại mảng đơn giản nhất chỉ chứa một hàng để lưu trữ dữ liệu.
- Mảng nhiều chiều (Multidimensional Array): Mảng nhiều chiều trong C# là kiểu mảng chứa nhiều hơn một hàng để lưu trữ dữ liệu của mảng. Mảng nhiều chiều còn được gọi là mảng hình chữ nhật vì nó có độ dài mỗi hàng bằng nhau.
- Mảng răng cưa (Jagged Array): Đây là mảng có các phần tử là mảng, có thể có kích thước khác nhau. Một mảng răng cưa đôi khi được gọi là “mảng của các mảng”.
Mảng là các đối tượng
Trong C#, mảng thực sự là các đối tượng chứ không chỉ là các vùng bộ nhớ liền kề được xác định địa chỉ như trong C và C++. Về bản chất khi khai báo bất cứ một mảng nào thì thực sự đều có thể coi đó là một đối tượng thể hiện của lớp Array trong C#.
Lớp Array là kiểu dữ liệu đối tượng cơ sở trừu tượng của tất cả các kiểu mảng. Nó được định nghĩa trong thư viện System. Lớp Array cung cấp các thuộc tính và phương thức khác nhau để làm việc với mảng. Cụ thể, lớp Array cung cấp các phương thức để tạo, thao tác, tìm kiếm và sắp xếp mảng, do đó đóng vai trò là lớp cơ sở cho tất cả các mảng trong thời gian chạy ngôn ngữ chung.
Khi tạo bất kỳ 1 mảng nào đó, bạn có thể sử dụng các thuộc tính và phương thức hoạt động mà lớp Array có. Một ví dụ về điều này là sử dụng thuộc tính Length để lấy độ dài của một mảng.
Thuộc tính của lớp Array
Thuộc tính | Mô tả |
---|---|
IsFixedSize | Nhận giá trị cho biết mảng có kích thước cố định hay không. |
IsReadOnly | Nhận giá trị cho biết mảng có ở chế độ chỉ đọc hay không. |
IsSynchronized | Nhận một giá trị cho biết quyền truy cập vào Mảng có được đồng bộ hóa hay không (luồng an toàn). |
Length | Nhận tổng số phần tử trong tất cả các chiều của mảng. |
Rank | Nhận thứ hạng (số nguyên) của mảng. Ví dụ: mảng một chiều trả về 1, mảng hai chiều trả về 2, … |
SyncRoot | Nhận một đối tượng có thể được sử dụng để đồng bộ hóa quyền truy cập vào mảng. |
Phương thức của lớp Array
Phương thức | Mô tả |
---|---|
BinarySearch() | Tìm kiếm một mảng được sắp xếp một chiều cho một giá trị, sử dụng thuật toán tìm kiếm nhị phân. |
Clear() | Xóa nội dung của một mảng. |
Clone() | Tạo một bản sao của mảng. |
ConstrainedCopy() | Sao chép một loạt các phần tử từ Mảng bắt đầu từ chỉ mục nguồn được chỉ định và dán chúng vào Mảng khác bắt đầu từ chỉ mục đích đã chỉ định. Đảm bảo rằng tất cả các thay đổi sẽ được hoàn tác nếu bản sao không hoàn toàn thành công. |
ConvertAll() | Chuyển đổi một mảng của một kiểu thành một mảng của một kiểu khác. |
Copy() | Sao chép một loạt các phần tử từ mảng này sang mảng khác và thực hiện ép kiểu và boxing theo yêu cầu. |
CopyTo() | Sao chép tất cả các phần tử của mảng một chiều hiện tại sang mảng một chiều được chỉ định. |
CreateInstance() | Khởi tạo một thể hiện mới của lớp mảng. |
Empty() | Trả về một mảng trống. |
Exists() | Xác định xem mảng được chỉ định có chứa các phần tử phù hợp với các điều kiện được xác định bởi vị từ được chỉ định hay không. |
Find() | Tìm kiếm một phần tử phù hợp với các điều kiện được xác định bởi vị từ được chỉ định và trả về lần xuất hiện đầu tiên trong toàn bộ mảng. |
FindAll() | Truy xuất tất cả các phần tử phù hợp với các điều kiện được xác định bởi vị từ được chỉ định. |
FindIndex() | Tìm kiếm một phần tử phù hợp với các điều kiện được xác định bởi một vị từ được chỉ định và trả về chỉ mục dựa trên 0 của lần xuất hiện đầu tiên trong Mảng hoặc một phần của nó. |
FindLast() | Tìm kiếm một phần tử phù hợp với các điều kiện được xác định bởi vị từ được chỉ định và trả về lần xuất hiện cuối cùng trong toàn bộ mảng. |
FindLastIndex() | Tìm kiếm một phần tử phù hợp với các điều kiện được xác định bởi một vị từ được chỉ định và trả về chỉ mục dựa trên 0 của lần xuất hiện cuối cùng trong Mảng hoặc một phần của nó. |
GetLength() | Nhận một số nguyên 32 bit đại diện cho số phần tử trong kích thước được chỉ định của mảng. |
GetLowerBound() | Nhận chỉ số của phần tử đầu tiên của chiều được chỉ định trong mảng. |
GetType() | Nhận loại của mảng hiện tại. |
GetUpperBound() | Nhận chỉ số của phần tử cuối cùng của chiều được chỉ định trong mảng. |
GetValue() | Nhận giá trị của phần tử được chỉ định trong mảng hiện tại. |
IndexOf() | Tìm kiếm đối tượng được chỉ định và trả về chỉ số của lần xuất hiện đầu tiên của nó trong mảng một chiều hoặc trong một phạm vi các phần tử trong mảng. |
Initialize() | Khởi tạo mọi phần tử của mảng kiểu giá trị bằng cách gọi hàm tạo mặc định của kiểu giá trị. |
LastIndexOf() | Trả về chỉ số của lần xuất hiện cuối cùng của một giá trị trong mảng một chiều hoặc trong một phần của mảng. |
Resize() | Thay đổi số phần tử của mảng một chiều thành kích thước mới được chỉ định. |
Reverse() | Đảo ngược thứ tự của các phần tử trong Mảng một chiều hoặc trong một phần của mảng. |
SetValue() | Đặt phần tử được chỉ định trong mảng hiện tại thành giá trị được chỉ định. |
Sort() | Sắp xếp các phần tử trong mảng một chiều. |
TrueForAll() | Xác định xem mọi phần tử trong mảng có khớp với các điều kiện được xác định bởi vị từ được chỉ định hay không. |
Lưu ý:
Phương thức Sort() sử dụng thuật toán sắp xếp nội quan (Introspective Sort) như sau:
- Nếu kích thước phân vùng nhỏ hơn hoặc bằng 16 phần tử, nó sử dụng thuật toán sắp xếp chèn (Insertion Sort).
- Nếu số lượng phân vùng vượt quá 2 * LogN, trong đó N là phạm vi của mảng đầu vào, nó sử dụng giải thuật thuật sắp xếp vun đống (Heap Sort).
- Nếu không, nó sử dụng giải thuật sắp xếp nhanh (Quick Sort).
Khai báo và tạo mảng
Như đã nói ở trên, mảng là các đối tượng trong C# nên bạn có thể tạo mảng bằng cách sử dụng toán tử new. Khi tạo mảng bạn phải chỉ định chỉ định kiểu phần tử mảng và số lượng phần tử.
Cú pháp tạo mảng một chiều:
dataType[] arrayName = new dataType[arraySize];
Cú pháp tạo mảng hai chiều:
dataType[,] arrayName = new dataType[rowSize, columnSize];
Cú pháp tạo mảng răng cưa:
dataType[,] arrayName = new dataType[arraySize][];
trong đó,
- dataType được sử dụng để chỉ ra kiểu của các phần tử trong mảng
- arrayName chỉ ra tên của mảng
- arraySize chỉ ra kích cỡ của mảng
- rowSize chỉ ra số hàng
- columnSize chỉ ra số cột
Ví dụ về khai báo và tạo mảng trong C#:
// declare a single dimensional array of 5 integers
int[] array1 = new int[5];
// declare and set array element values
int[] array2 = new int[] {1, 3, 5, 7, 9};
// alternative syntax to declare array
int[] array3 = {1, 2, 3, 4, 5, 6};
// declare a two dimensional array
int[,] array4 = new int[2, 3];
// declare and set array element values
int[,] array5 = {{1, 2, 3}, {4, 5, 6}};
// declare a jagged array.
int[][] array6 = new int[3][];
// set the values of the jagged array
array6[0] = new int[3] {1, 2, 3};
array6[1] = new int[4] {4, 5, 6, 7};
array6[2] = new int[5] {8, 9, 10, 11, 12, 13};
Ví dụ về thao tác với mảng một chiều
Ví dụ 1: Truy xuất mảng dùng vòng lặp for
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Bai_03_01 { class Program { static void Main(string[] args) { // Truy suat mang dùng vòng lặp for int[] numbers = { 1, 2, 3, 4, 5, 6 }; int i; for (i=0;i<numbers.Length;i++) { Console.WriteLine("numbers [" + i + "]: " + numbers[i]); } Console.ReadLine(); } } }
Ví dụ 2: Truy xuất mảng dùng vòng lặp foreach