Tài liệu Tìm hiểu C# và ứng dụng của C# p 11 - Pdf 98

Array, Indexer, and Collection Gvhd: Nguyễn Tấn Trần Minh Khang
58 Chương 9 Array, Indexer, and Collection
.NET Framework cung cấp cho ta rất nhiều kiểu lớp tập hợp: Array, ArrayList,
NameValueCollection, StringCollection, Queue, Stack, và BitArray. Array là lớp
đơn giản nhất. Trong C# nó được ánh xạ thành cú pháp dựng sẵn tương tự như
C/C++.
Net Framework cũng cung nấp những giao diện chuẩn như IEnumerable,
ICollection để tương tác với các lớp tập hợp (túi chứa).
9.1 Mảng (Array)
Mảng là một tập hợp các phần tử có cùng kiểu, được xác định vị trí trong tập hợp
bằng chỉ mục. C# cung cấp những dạng cú pháp dạng đơn giản nhất cho việc khai
báo một mảng, rất dễ học và sử dụng.
9.1.1 Khai báo mảng
Chúng ta có thể khai báo một mảng kiểu C# như sau:
kiểu[] tên_mảng;
Ví dụ như:
int[] myIntArray;
Dấu ngoặc vuông [ ] biểu thị cho tên biến ở sau là một mảng Ví dụ dưới đây khai
báo một biến kiểu mảng nguyên myIntArray với số phần tử ban đầu là 5:
myIntArray = new int[5];
9.1.2 Giá trị mặc định
Giả sử có đoạn mã sau:
/*1*/ int[] myArray;
/*2*/ maArray = new int[5];

/*3*/ Button[] myButtonArray;
/*4*/ myButtonArray = new Button[5];
dòng /*1*/ khai báo biến myArray là một mảng kiểu int. Khi này biến myArray có

{
this.empID = empID;
}
public override string ToString()
{
return empID.ToString();
}
private int empID;
private int size;
}
public class Tester
{
static void Main()
{
int[] intArray;
Employee[] empArray;
intArray = new int[5];
empArray = new Employee[3];
// populate the array
for (int i = 0; i < empArray.Length; i++)
empArray[i] = new Employee(i+10);

foreach (int i in intArray)
Console.WriteLine(i.ToString());

foreach (Employee e in empArray)
Console.WriteLine(e.ToString());
Array, Indexer, and Collection Gvhd: Nguyễn Tấn Trần Minh Khang
60


*/
t.DisplayVals(5,6,7,8);

/**
* Cách truyền tham số bằng mảng
* Mảng phải được tạo sẵn
*/
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);
}
}
Array, Indexer, and Collection Gvhd: Nguyễn Tấn Trần Minh Khang
61
}
}
Kết quả:
DisplayVals 5
DisplayVals 6
DisplayVals 7
DisplayVals 8
DisplayVals 1
DisplayVals 2
DisplayVals 3
DisplayVals 4

9.3 Indexers
Indexer tương tự như Property, tuy có khác nhau một chút về ý nghĩa. Xét một ví dụ
mô phỏng một quyển sách có nhiều chương
Xây dựng 2 lớp Sách và Chương. Lớp Chương cài đặt bình thường. Với lớp Sách ta
sẽ cài đặt một biến thành viên có kiểu túi chứa. Để đơn giản biến này có kiểu là một
mảng
public class Chuong
{
// Các biến thành viên
string m_sTen;
string m_sNoiDung;
}
public class Sach
{
// biến thành viên
Chuong[] m_dsChuong;

// Property
public Chuong[] DsChuong
{
get{ return m_dsChuong; }
}
}
Cách làm này có vài bất lợi như sau: thứ nhất để lấy nội dung từng chương chúng ta
dùng Property để lấy danh sach chương sau đó duyệt qua mảng để lấy chương mong
muốn. Thứ hai là mỗi chương được định danh bởi tên chương nên ta mong muốn có
cách lấy một chương thông qua tên của nó. Ta có thể cài đặt một hàm để duyệt qua
mảng các chương, nhưng Indexer sẽ giúp làm việc này.
Ví dụ 9-3 Sử dụng indexer
using System;

} // hết class Chuong
// Cài đặt lớp Sach
public class Sach
{
private string m_sTen;
private ArrayList m_dsChuong;
public Sach()
{
m_sTen = "";
m_dsChuong = new ArrayList();
}
public Sach(string sTen)
{
m_sTen = sTen;
m_dsChuong = new ArrayList();
}
public string Ten
{
get { return m_sTen; }
set
{
if ( value == null )
throw new ArgumentNullException();

m_sTen = value;
}
}
// indexer thứ nhất có một tham số kiểu int
public Chuong this[int index]
{

return null;
}
}
public int add (Chuong chuong)
{
if ( chuong == null )
throw new ArgumentNullException();

return m_dsChuong.Add(chuong);
}
}// hết class Sach

class Class
{
static void Main(string[] args)
{
Sach s = new Sach("tlv");
s.add(new Chuong("CS", "Tac gia CS"));
s.add(new Chuong("VB", "Tac gia VB"));

Console.WriteLine(s.Ten);
// dùng indexer thứ nhất
Console.WriteLine(s[0].Ten + ": "+ s[0].NoiDung);
// dùng indexer thứ hai
Console.WriteLine("VB: " + s["VB"].NoiDung);

Console.Read();
}
}
}

IComparer So sánh hai đối tượng trong túi chứa
IList Dùng bởi các lớp túi chứa truy xuất phần tử thông qua chỉ mục
(số)
IDictionary Dùng bởi các lớp túi chứa truy xuất phần tử thông qua quan hệ
khóa/giá trị như Hashtabe, StoredList.
IDictionaryEnumerator Cho phép duyệt đối với các túi chứa cài đặt IDictionary
9.5 Array Lists
Một vấn đề cổ điển trong khi sử dụng lớp Array là kích thước: kích thước một mảng
cố định. Nếu không thể biết trước cần có bao nhiêu phần tử, ta có thể khai báo quá
nhiều (lãng phí) hay quá ích (chương trình có lỗi). ArrayList cài đãt cấu trúc dữ liệu
danh sach liệt kê cho phép cấp phát động các phần tử. Lớp này cài đặt giao diện
IList, ICollection, IEnumerable và có rất nhiều hàm dùng để thao tác lên danh sách.
IComparable
ArrayList có phương thức Sort( ) giúp chúng ta sắp xếp các phần tử. Điều bắt buộc
là phần tử phải thuộc lớp có cài đặt giao diện IComparable (có duy nhất một
phương thức CompareTo()).
9.6 Hàng đợi
Hàng đợi (queue) là một túi chứa hoạt động theo cơ chế FIFO (First in first out -
vào trước ra trước). Cũng giống như ta đi xếp hàng mua vé xem phim, nếu ta vào
trước mua vé thì ta sẽ được mua vé trước.
Hàng đợi là một tập hợp tốt cho việc ta sử dụng để quản lí nguồn tài nguyên có giới
hạn. Ví dụ như ta gửi đi những thông điệp đến tài nguyên, mà tài nguyên thì chỉ có
thể giải quyết cho một thông điệp. Do đó chúng ta phải tạo một hàng đợi những
Array, Indexer, and Collection Gvhd: Nguyễn Tấn Trần Minh Khang
66
thông điệp để cho tài nguyên có thể dựa vào đó mà xử lí “từ từ”. Lớp Queue cài đặt
túi chứa này.
9.7 Stacks
Stack là túi chứa hoạt động theo cơ chế LIFO (Last in first out - vào sau ra trước).
Hai phương thức cơ bản trong việc thêm hoặc xóa Stack là:Push( ) và Pop( ). Ngoài


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status