Ngôn Ngữ Lập Trình C#
thông qua thứ tự của empID là một số nguyên. Do vậy việc so sánh sẽ được ủy quyền cho
thành viên empID, đây là số nguyên và nó sẽ sử dụng phương thức so sánh mặc định của kiểu
dữ liệu nguyên. Điều này tương đương với việc so sánh hai số nguyên. Lúc này chúng ta co
thể thực hiện việc so sánh hai đối tượng Employee. Để thấy được cách sắp xếp, chúng ta cần
thiết phải thêm vào các số nguyên vào trong mảng Employee, các số nguyên này được lấy
một cách ngẫu nhiên. Để tạo một giá trị ngẫu nhiên, chúng ta cần thiết lập một đối tượng của
lớp Random, lớp này sẽ trả về một số giả số ngẫu nhiên. Phương thức Next() được nạp
chồng, trong đó một phiên bản cho phép chúng ta truyền vào một số nguyên thể hiện một số
ngẫu nhiên lớn nhất mong muốn. Trong trường hợp này chúng ta đưa vào số 10 để tạo ra
những số ngẫu nhiên từ 0 đến 10:
Random r = new Random();
r.Next(10);
Ví dụ minh họa 9.13 tạo ra một mảng các số nguyên và một mảng Employee, sau đó đưa vào
những số ngẫu nhiên, rồi in kết quả. Sau đó sắp xếp cả hai mảng và in kết quả cuối cùng.
Ví dụ 9.13: Sắp xếp mảng số nguyên và mảng Employee.
namespace Programming_CSharp
{
using System;
using System.Collections;
// một lớp đơn giản để lưu trữ trong mảng
public class Employee : IComparable
{
public Employee(int empID)
{
this.empID = empID;
}
public override string ToString()
{
return empID.ToString();
ArrayList intArray = new ArrayList();
Random r = new Random();
// đưa vào mảng
for( int i = 0; i < 5; i++)
{
empArray.Add( new Employee(r.Next(10)+100));
intArray.Add( r.Next(10) );
}
// in tất cả nội dung
for(int i = 0; i < intArray.Count; i++)
{
Console.Write(“{0} ”,intArray[i].ToString());
}
Console.WriteLine(“\n”);
// in tất cả nội dung của mảng
for(int i = 0; i < empArray.Count; i++)
{
Console.Write(“{0} ”,empArray[i].ToString());
}
Mảng, Chỉ Mục, và Tập Hợp
254
Ngôn Ngữ Lập Trình C#
Console.WriteLine(“\n”);
// sắp xếp và hiển thị mảng nguyên
intArray.Sort();
for(int i = 0; i < intArray.Count; i++)
{
Console.Write(“{0} ”, intArray[i].ToString());
}
Console.WriteLine(“\n”);
Ngôn Ngữ Lập Trình C#
Để thực hiện được điều này, chúng ta cần thiết phải tạo lại sự thực thi của IComparer để
truyền cho phương thức Sort() của mảng ArrayList. Lớp IComparer EmployeeComparer biết
về những đối tượng Employee và cũng biết cách sắp xếp chúng. EmployeeComparer có một
thuộc tính, WhichComparision có kiểu là Employee.EmployeeComparer.ComparisionType:
public Employee.EmployeeComparer.ComparisionType WhichComparision
{
get
{
return whichComparision;
}
set
{
wichComparision = value;
}
}
ComparisionType là kiểu liệt kê với hai giá trị, empID hay yearsOfSvc, hai giá trị này chỉ ra
rằng chúng ta muốn sắp xếp theo ID hay số năm phục vụ:
public enum ComparisionType
{
EmpID,
Yrs
};
Trước khi gọi Sort(), chúng ta sẽ tạo thể hiện của EmployeeComparer và thiết lập giá trị cho
thuộc tính kiểu ComparisionType:
Employee.EmployeeComparer c = Employee.GetComparer();
c.WhichComparision = Employee.EmployeeComparer.ComparisionType.EmpID;
empArray.Sort(c);
Khi chúng ta gọi Sort() thì ArrayList sẽ gọi phương thức Compare() trong Employee-
Comparer, đến lượt nó sẽ ủy quyền việc so sánh cho phương thức Employee.CompareTo(),
{
using System;
using System.Collections;
//lớp đơn giản để lưu trữ trong mảng
public class Employee : IComparable
{
public Employee(int empID)
{
this.empID = empID;
}
public Employee(int empID, int yearsOfSvc)
{
this.empID = empID;
this.yearsOfSvc = yearsOfSvc;
}
public override string ToString()
{
return “ID: ”+empID.ToString() + “. Years of Svc: ”
+ yearsOfSvc.ToString();
}
Mảng, Chỉ Mục, và Tập Hợp
257