Khóa học lập trình C# nâng cao

Khóa học lập trình C# nâng cao

SortedList trong C# SortedList trong C# SortedList trong C# SortedList trong C# SortedList trong C# 5/5 (24 reviews)

SortedList trong C#

Đã đăng 2017-11-22 20:23:17 bởi Kteam
1 bình luận 4582 lượt xem
SortedList trong C# 5 /5 stars (1 reviews)
 

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về HASTABLE TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về SortedList trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • SortedList là gì?
  • Một số thuộc tính và phương thức hỗ trợ sẵn trong SortedList.

SortedList là gì?

SortedList cũng là một Collections lưu trữ dữ liệu dưới dạng cặp Key - Value. Key đại diện cho 1 khoá giống như chỉ số phần tử của mảng và Value chính là giá trị tương ứng của khoá đó.

Đặc điểm của SortedList

  • Là 1 Hashtable nhưng các giá trị được sắp xếp theo Key. Việc sắp xếp này được thực hiện một cách tự động mỗi khi thêm 1 phần tử mới vào SortedList.
  • Có thể truy xuất đến các phần tử trong SortedList thông qua Key (như Hashtable) hoặc thông qua chỉ số phần tử (như ArrayList).
  • SortedList chính là sự kết hợp giữa ArrayList với Hashtable.

Do SortedList cũng là 1 Collections nên để sử dụng ta cần thêm thư viện System.Collections bằng câu lệnh:

using System.Collections;

Trước khi sử dụng ta cần khởi tạo vùng nhớ bằng toán tử new:

SortedList MySL = new SortedList(); // khởi tạo 1 SortedList rỗng

Bạn cũng có chỉ định sức chứa (Capacity) ngay lúc khởi tạo bằng cách thông qua constructor được hỗ trợ sẵn:

SortedList MySL2 = new SortedList(5); // khởi tạo 1 SortedList và chỉ định Capacity ban đầu là 5

Bạn cũng có thể khởi tạo 1 SortedList chứa các phần tử được sao chép từ một SortedList khác:

/*
 * Khởi tạo 1 SortedList có kích thước bằng với MySL2.
 * Sao chép toàn độ phần tử trong MySL2 vào MySL3.
 */
SortedList MySL3 = new SortedList(MySL2);

Vì các phần tử của SortedList được sắp xếp tự động theo Key nên ta cũng có thể chỉ ra cách sắp xếp do mình tự định nghĩa (trong bài ARRAYLIST TRONG C# mình đã có trình bày về việc định nghĩa lại cách sắp xếp) thông qua constructor có sẵn:

/*
 * Mình định nghĩa 1 lớp PersonComparer có thực thi 1 interface IComparer
 * Sau đó override lại phương thức Compare.
 * Sử dụng lớp trên để truyển vào constructor của SortedList.
 */
SortedList MySL4 = new SortedList(new PersonComparer());

Ngoài ra bạn cũng có thể khởi tạo 1 SortedList chứa các phần tử được sao chép từ 1 SortedList khác đồng thời sắp xếp lại các phần tử theo 1 cách sắp xếp khác:

/*
 * Tạo 1 SortedList mới và sao chép các phần tử từ MySL3 đồng thời sắp xếp các phần tử lại
 * theo cách sắp xếp được định nghĩa trong lớp PersonComparer.
 */
SortedList MySL5 = new SortedList(MySL3, new PersonComparer());

Một số thuộc tính và phương thức hỗ trợ sẵn trong SortedList

SortedList là sự kết hợp giữa ArrayListHashtable nên nó sẽ mang các thuộc tính, phương thức giống 2 Collections trên và một vài phương thức mới. Ở đây Kteam xin giới thiệu lại để những bạn nào chưa theo dõi những bài trước cũng có thể nắm.

Một số thuộc tính thông dụng trong SortedList:

Một số phương thức thông dụng trong SortedList:

Về cách sử dụng thì bạn thao tác hoàn toàn giống với Hashtable.


Một số lưu ý

  1. Nếu bạn muốn các giá trị Key là các đối tượng thuộc 1 lớp nào đó thì bạn phải định nghĩa cách so sánh đối tượng đó. Nếu không chương trình sẽ báo lỗi vì nó không biết phải sắp xếp các Key này như thế nào. Ví dụ đoạn chương trình sau:
SortedList MySL6 = new SortedList();
MySL6.Add(new Person("HowKteam", 20), 10);
MySL6.Add(new Person("Kteam", 2), 15);

Khi chạy chương trình trên sẽ nhận được lỗi sau:

Để khắc phục điều này ta có thể định nghĩa 1 lớp thực thi interface IComparer và định nghĩa cách sắp xếp trong hàm Comparer:

/// <summary>
/// Định nghĩa 1 lớp thực thi interface IComparer.
/// override phương thức Comparer và định nghĩa cách sắp xếp trong đó.
/// Chi tiết bạn có thể xem lại bài ArrayList trong C#.
/// </summary>
class PersonComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            Person a = x as Person;
            Person b = y as Person;

            if (a == null || b == null)
            {
                throw new InvalidOperationException();
            }
            else
            {
                if (a.Age > b.Age)
                {
                    return 1;
                }
                else if (a.Age == b.Age)
                {
                    return 0;
                }
                else
                {
                    return -1;
                }
            }
        }
    }

Sau đó sử dụng constructor của SortedList để truyền lớp này vào:

// tạo 1 SortedList và truyền vào cách sắp xếp các Key trong SortedList này.
            SortedList MySL6 = new SortedList(new PersonComparer());

Khi đó chương trình sẽ căn cứ vào hàm Comparer để sắp xếp các Key.

  1. Khi các Key hoặc Value là các đối tượng thuộc 1 lớp nào đó thì thì ta nên override lại phương thức ToString để việc in ra KeyValue không bị lỗi:

Ví dụ với đoạn chương trình trên khi chưa override phương thức ToString thì kết quả hiển thị là:

Ta thử override phương thức ToString trong lớp Person:

public override string ToString()
{
     return Name + " : " + Age;
}

Kết quả là:


Kết luận

Nội dung bài này giúp các bạn nắm được:

  • SortedList là gì?
  • Một số thuộc tính và phương thức hỗ trợ sẵn trong SortedList.

Bài học sau chúng ta sẽ cùng tìm hiểu về STACK TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.

 


Tài liệu 

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học SortedList trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
SortedList trong C#
hthecong 2018-06-07 08:59:54

Cảm ơn KTeam! Nên có thêm loạt bài về System.Collections.Generic nữa. Vì hiện nay hầu như không còn sử dụng Collection nữa rồi. 

0 bình chọn
Reply
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education