ArrayList trong C#

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

5.0 (8 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 22:19 26-07-2020 113.286 lượt xem 26 bình luận
Tác giả/Dịch giả: Kteam
Học nhanh

Danh sách bài học

ArrayList trong C#

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về TỔNG QUAN COLLECTIONS TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về ArrayList 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 đề:

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

ArrayList là gì?

ArrayList trong C#:

  • Là một Collections giúp lưu trữ và quản lý một danh sách các đối tượng theo kiểu mảng (truy cập các phần tử bên trong thông qua chỉ số index).
  • Rất giống mảng các object nhưng có thể thêm hoặc xoá các phần tử một cách linh hoạt và có thể tự điều chỉnh kích cỡ một cách tự động.

Để sử dụng các Collections trong .NET ta cần thêm thư viện System.Collections bằng câu lệnh:

using System.Collections;

Vì ArrayList là một lớp nên trước khi sử dụng ta cần khởi tạo vùng nhớ bằng toán tử new:

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

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:

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

Ngoài ra bạn cũng có thể khởi tạo 1 ArrayList chứa các phần tử được sao chép từ một Collections khác:

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

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

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

  TÊN THUỘC TÍNH  

Ý NGHĨA

Count

  Trả về 1 số nguyên là số phần tử hiện có trong ArrayList.

Capacity  

  Trả về 1 số nguyên cho biết số phần tử mà ArrayList có thể chứa (sức chứa).
  Nếu số phần tử được thêm vào chạm sức chứa này thì hệ thống sẽ tự động tăng lên.
  Ngoài ra ta có thể gán 1 sức chứa bất kỳ cho ArrayList.

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

TÊN PHƯƠNG THỨC

Ý NGHĨA

  Add(object Value)

  Thêm đối tượng Value vào cuối ArrayList.

  AddRange(ICollection ListObject)

  Thêm danh sách phần tử ListObject vào cuối ArrayList.

  BinarySearch(object Value)

  Tìm kiếm đối tượng Value trong ArrayList theo thuật toán tìm kiếm nhị phân.
  Nếu tìm thấy sẽ trả về vị trí của phần tử ngược lại trả về giá trị âm.

Lưu ý: là ArrayList phải được sắp xếp trước khi sử dụng hàm.

  Clear()

  Xoá tất cả các phần tử trong ArrayList.

  Clone()

  Tạo 1 bản sao từ ArrayList hiện tại.

  Contains(object Value)

  Kiểm tra đối tượng Value có tồn tại trong ArrayList hay không.

  GetRange(int StartIndex, int EndIndex)

  Trả về 1 ArrayList bao gồm các phần tử từ vị trí StartIndex đến
  EndIndex trong ArrayList ban đầu.

  IndexOf(object Value)

  Trả về vị trí đầu tiên xuất hiện đối tượng Value trong ArrayList.
  Nếu không tìm thấy sẽ trả về -1.

  Insert(int Index, object Value)

  Chèn đối tượng Value vào vị trí Index trong ArrayList.

  InsertRange(int Index, ICollection ListObject)

  Chèn danh sách phần tử ListObject vào vị trí Index trong ArrayList.

  LastIndexOf(object Value)

  Trả về vị trí xuất hiện cuối cùng của đối tượng Value trong ArrayList.
  Nếu không tìm thấy sẽ trả về -1.

  Remove(object Value)

  Xoá đối tượng Value xuất hiện đầu tiên trong ArrayList.

  Reverse()

  Đảo ngược tất cả phần tử trong ArrayList.

  Sort()

  Sắp xếp các phần tử trong ArrayList theo thứ tự tăng dần.

  ToArray()

  Trả về 1 mảng các object chứa các phần tử được sao chép từ ArrayList.

Những phương thức trên này cũng khá đơn giản nên mình sẽ không tập trung vào chúng mà để các bạn tự khám phá. Thay vào đó mình sẽ hướng dẫn những thứ hay ho hơn.

Ở trên mình có giới thiệu phương thức Sort() sẽ thực hiện sắp xếp danh sách theo thứ tự tăng dần. Vậy nếu danh sách của mình gồm các đối tượng mà mỗi đối tượng là 1 lớp có nhiều thuộc tính thì hàm Sort này biết sắp xếp tăng dần theo thuộc tính nào?

Để trả lời câu hỏi này thì chúng ta cần biết thêm là còn 1 hàm Sort nữa được hỗ trợ sẵn trong ArrayList có cú pháp như sau:

Sort IComparer comparer)

Công dụng:

  • Hàm này cho phép người dùng tự định nghĩa cách sắp xếp theo ý mình.
  • Tham số truyền vào là 1 lớp có kế thừa từ interface IComparer .
  • Interface IComparer chứa 1 phương thức duy nhất là:

int Comparer (object x, object y).

Phương thức này sẽ trả về 3 giá trị:

  •  Bé hơn 0 nếu x < y.
  •  Lớn hơn 0 nếu x > y.
  • Bằng 0 nếu x = y.

Từ những quy định về inferface này ta chỉ cần khai báo 1 lớp kế thừa interface IComparer và định nghĩa nội dụng cho phương thức Comparer có giá trị trả về theo những quy định trên.


Ví dụ

Bắt tay vào code nào!

Đầu tiên ta có 1 lớp Person đại diện cho 1 con người bao gồm 2 thông tin Name Age.

public class Person
    {
        private string name;
        private int age;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        /// <summary>
        /// Tạo 1 constructor có tham số để tiện cho việc khởi tạo nhanh đối tượng Person với các giá trị cho sẵn.
        /// </summary>
        /// <param name="Name"></param>
        /// <param name="Age"></param>
        public Person(string Name, int Age)
        {
            this.Name = Name;
            this.Age = Age;
        }

        /// <summary>
        /// Override phương thức ToString để khi cần có thể in thông tin của object ra cho nhanh.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return "Name: " + name + " | Age: " + age;
        }
    }

Tiếp theo ta định nghĩa 1 lớp kế thừa interface ICompare override lại phương thức Compare trong interface này. Hàm Compare sẽ so sánh dựa trên thuộc tính tuổi tăng dần.

 public class SortPersons : IComparer
    {
        public int Compare(object x, object y)
        {
            // Ép kiểu 2 object truyền vào về Person.
            Person p1 = x as Person;
            Person p2 = y as Person;

            /*
             * Vì có thể 2 object truyền vào không phải Person khi đó ta không thể so sánh được.
             * Trường hợp này tốt nhất ta nên ném ra lỗi để lập trình viên sửa chữa.
             * Chi tiết về exception sẽ được trình bày ở những bài học sau.
             */
            if (p1 == null || p2 == null)
            {
                throw new InvalidOperationException();
            }
            else
            {
                /*
                 * Khi dữ liệu đã ok thì ta thực hiện so sánh và trả về các giá trị 1 0 -1 tương ứng
                 * lớn hơn, bằng, bé hơn.
                 */
                if (p1.Age > p2.Age)
                {
                    return 1;
                }
                else if (p1.Age == p2.Age)
                {
                    return 0;
                }
                else
                {
                    return -1;
                }
            }
        }
    }

Cuối cùng là chương trình chính ta thử tạo 1 ArrayList và thêm 1 vài đối tượng Person vào sau đó gọi hàm Sort() và xem kết quả.

// Tạo 1 danh sách kiểu ArrayList rỗng
ArrayList arrPersons = new ArrayList();

// Thêm 3 Person vào danh sách
arrPersons.Add(new Person("Nguyen Van A", 18));
arrPersons.Add(new Person("Nguyen Van B", 25));
arrPersons.Add(new Person("Nguyen Van C", 20));

// In thử danh sách Person ban đầu ra.
Console.WriteLine("Danh sach Person ban dau: ");
foreach (Person item in arrPersons)
{
    Console.WriteLine(item.ToString());
}

/* 
 * Thực hiện sắp xếp danh sách Person theo tiêu chí đã được định nghĩa 
 * trong phương thức Compare của lớp SortPerson (tuổi tăng dần).
*/
arrPersons.Sort(new SortPersons());

// In danh sách Person đã được sắp xếp ra màn hình.
Console.WriteLine();
Console.WriteLine("Danh sach Person da duoc sap xep theo tuoi tang dan: ");
foreach (Person item in arrPersons)
{
    Console.WriteLine(item.ToString());
}

Kết quả: Danh sách đã được sắp xếp theo tuổi tăng dần.

ArrayList trong C#,ListObject ,Capacity  ,AddRange,ICollection ,ListObject,BinarySearch,Contains,GetRange,IndexOf,InsertRange,LastIndexOf,Reverse,ToArray

Tương tự các hoàn toàn có thể định nghĩa cách so sánh phức tạp hơn như thế nữa…


Kết luận

Qua bài này chúng ta đã nắm được:

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

Bài học sau chúng ta sẽ cùng tìm hiểu về HASHTABLE 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 xuống

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 ArrayList 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 likeshare để ủng hộ Kteam và tác giả nhé!

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!


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ê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.

Nội dung bài viết

Tác giả/Dịch giả

Khóa học

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

Bạn đã học hết các khoá học về C# CƠ BẢN, LẬP TRÌNH WINFORM thậm chí là LẬP TRÌNH WPF nhưng vẫn bối rối trước những hướng dẫn về CÁC PROJECT THỰC TẾ của Kteam?

Hoặc bạn nghe nói mãi về .NET nhưng vẫn thắc mắc nó có gì hay ho bên trong đó?

Hay đơn giản bạn viết muốn 1 đoạn code cực kỳ nguy hiểm khiến người khác khi nhìn vào phải thốt lên: “Ồ!!!......... Trẻ trâu…”

Khoá học lần này sẽ giúp bạn giải đáp những thắc mắc trên. Chào mừng các bạn đã đến với khoá học Lập trình C# nâng cao của Kteam.

Đánh giá

dangvanlong275 đã đánh giá 16:28 09-08-2024

Nerosaro đã đánh giá 18:31 31-07-2021

0932110332 đã đánh giá 15:59 02-01-2021

Kobe24 đã đánh giá 11:21 12-09-2020

Thanks HowKteam/K9!

Phạm Minh Toàn đã đánh giá 22:31 05-07-2020

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Lục Xuân Trường đã bình luận 16:53 07-01-2023

Cho e hỏi với. Person() và SortPersons() là class, để sử dụng thì phải thông qua khởi tạo đối tượng đại diện, nhưng ở đây e thấy chỉ dùng "new Person" (arrPersons.Add(new Person("Nguyen Van A", 18));) là sử dụng được, tại sao ? tương tự với SortPersons() ?

Mong các anh chỉ giúp e với !

Em c.ơn ạ !

hienitvn1703 đã bình luận 17:37 26-07-2021

A cho em hỏi tại sao lại phải public class vậy ạ

public class Person
    {
        private string name;
        private int age;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        /// <summary>
        /// Tạo 1 constructor có tham số để tiện cho việc khởi tạo nhanh đối tượng Person với các giá trị cho sẵn.
        /// </summary>
        /// <param name="Name"></param>
        /// <param name="Age"></param>
        public Person(string Name, int Age)
        {
            this.Name = Name;
            this.Age = Age;
        }

        /// <summary>
        /// Override phương thức ToString để khi cần có thể in thông tin của object ra cho nhanh.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return "Name: " + name + " | Age: " + age;
        }
    }
 

 

sinhvienit đã bình luận 01:09 19-06-2021

thanks

DuongHuuLoc đã bình luận 16:53 11-06-2020

À mình có tìm được cách compare các kiểu khác nhau trong ArrayList: https://stackoverflow.com/questions/40019392/sorting-of-different-types-in-c-sharp-list

DuongHuuLoc đã bình luận 12:13 11-06-2020

Mình có thể dùng Linq và biểu thức lamda để sort 1 arraylist thay vì phải tạo class có cài đặt IComparer có đc ko ?

Không có video.