Để cho các bạn dễ hiểu thì chúng ta sẽ xét một ví dụ sau: Tạo một danh sách các số nguyên và sắp xếp danh sách đó theo thứ tự tăng dần. Yêu cầu sử dụng List<> để chứa các số nguyên đó và sử dụng phương thức Sort() có sẵn trong List<>. Đoạn code theo yêu cầu này có thể là như sau:
1
2
3
4
5
6
7
8
9
10
11
12
| public static void Main() { List< int > intList = new List< int >(); //Thêm ngẫu nhiên một vài số vào danh sách intList.Add(42); intList.Add(10); intList.Add(25); //Sắp xếp danh sách này bằng phương thức Sort() intList.Sort(); foreach ( int number in intList) Console.WriteLine(number); } |
Ví dụ tiếp theo có phần phức tạp hơn, đó là thay vì danh sách các số nguyên thì chúng ta sẽ làm việc với danh sách các đối tượng của lớp Person như sau:
1
2
3
4
5
| public class Person { public int Age{ get ; set ;} public string Name{ get ; set ;} } |
1
2
3
4
5
6
7
8
9
10
11
12
13
| public static void Main() { List<Person> personList = new List<Person>(); personList.Add( new Person{Age=10, Name= "John" }); personList.Add( new Person{Age=15, Name= "Ann" }); personList.Add( new Person{Age=8, Name= "Kevin" }); personList.Sort(); //Lỗi runtime ở đây foreach (var item in personList) { Console.WriteLine(item.Name + ":" + item.Age); } Console.ReadKey( true ); } |
Phương thức Sort() của List<> sẽ chỉ có thể hoạt động được đối với những class có cài đặt interface IComparable hoặc nếu không thì phải có một lớp khác đảm nhận công việc so sánh bằng cách cài đặt interface IComparer. Nói cách khác, các class này phải có một phương thức để chỉ rõ cách so sánh hai đối tượng của class đó là như thế nào.
IComparable có một phương thức duy nhất là CompareTo(). Tham số nhận vào là một kiểu object hoặc trong trường hợp bạn sử dụng interface IComparable<> thì tham số truyền vào là kiểu dữ liệu của lớp cài đặt interface đó. Như vậy, lớp Person của chúng ta lúc này sẽ là:
1
2
3
4
5
6
7
8
9
| public class Person : IComparable<Person> { public int Age { get ; set ;} public string Name{ get ; set ;} public int CompareTo(Person other) { return this .Age.CompareTo(other.Age); } } |
Sau khi đã chỉnh sửa lớp Person như trên thì ta đã có thể sử dụng được phương thức Sort() của List<> để sắp xếp các đối tượng kiểu Person
Tuy nhiên, việc cài đặt IComparable có một hạn chế đó là chúng ta chỉ có thể quy định cho lớp Person này 1 cách sắp xếp duy nhất. Giả sử chúng ta muốn cùng lúc vừa có thể sắp xếp danh sách personList theo tên, vừa có thể sắp xếp theo tuổi thì phải làm sao? Khi đó chúng ta cần đến sự trợ giúp của một interface khác: IComparer.
Khác với IComparable được cài đặt ngay trong lớp của đối tượng mà bạn muốn sắp xếp, Icomparer sẽ được cài đặt ở một lớp riêng, lớp này đóng vai trò là một Bộ so sánh, khi cần sắp xếp với tiêu chí nào thì ta chỉ cần chọn một Bộ so sánh phù hợp là được (Hãy tưởng tượng bạn đang có 10 thùng hàng và có 2 loại máy sắp xếp, nếu cho 10 thùng hàng này qua máy 1 thì các thùng hàng sẽ được sắp xếp theo kích thước, còn nếu cho 10 thùng hàng này qua máy 2 thì các thùng hàng sẽ được sắp xếp theo khối lượng. Máy 1 và 2 ở đây đóng vai tròng giống như các Comparer, mỗi máy sẽ có cách sắp xếp riêng mà khi cần sử dụng thì gọi tới nó).
Chúng ta sẽ bắt đầu với việc cài đặt một Bộ so sánh cho phép so sánh hai đối tượng kiểu Person theo thuộc tính Age và một Bộ so sánh theo thuộc tính Name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public class PersonAgeComparer : IComparer<Person> { public int Compare(Person x, Person y) { return x.Age.CompareTo(y.Age); } } public class PersonNameComparer : IComparer<Person> { public int Compare(Person x, Person y) { return x.Name.CompareTo(y.Name); } } |
Đã có hai lớp Comparer như trên, khi chúng ta muốn sử dụng bộ so sánh nào khi sắp xếp với phương thức Sort() thì chỉ việc tạo ra một đối tượng của lớp Comparer đó. Ví dụ như với danh sách personList đã tạo ra, chúng ta sẽ sắp xếp danh sách này theo tuổi như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public static void Main() { List<Person> personList = new List<Person>(); personList.Add( new Person{Age=10, Name= "John" }); personList.Add( new Person{Age=15, Name= "Ann" }); personList.Add( new Person{Age=8, Name= "Kevin" }); personList.Sort( new PersonAgeComparer()); foreach (var item in personList) { Console.WriteLine(item.Name + ":" + item.Age); } Console.ReadKey( true ); } |
1
| personList.Sort( new PersonNameComparer()); |
Nguồn: tapchilaptrinh.vn
No comments:
Post a Comment