Cách sử dụng Sort trong ArrayList trong C#?

Em đang làm bài tập đề bài yêu cầu tạo class

  • Account: gồm ID, Tên, Họ, Lương.
  • AccountList: chứa mảng các account sử dụng ArrayList

Giờ đề bài yêu cầu em sắp xếp theo ID, Tên, Lương, Họ thì em định dụng thuộc tính ArrayList.Sort nhưng em không sort đc?

Em có xem trên mạng thì cần dùng thêm hàm IComparer. Nhưng bữa giờ em làm hoài cũng không đc.

Mọi người có ai biết hướng dẫn em làm phần này với. Em cám ơn nhiều. :sleepy:

1 Like

Em gửi thêm code em đã làm đi, sửa trên đó sẽ dễ hơn.

À, có phải bài dưới có liên quan đến topic này không?

@dangh @tuancoi2506 có thời gian giúp được không :smile:

4 Likes

Của e đây, e tham khảo nhé, a mới chỉ sort theo họ và tên, e có thể tự tạo thêm các class để có thể sort theo id và lương.


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    
    namespace DemoArrarList
    {
        class Program
        {
            public class Account
            {
                public string sID { get; set; }
                public string sTen { get; set; }
                public string sHo { get; set; }
                public double dLuong { get; set; }
    
                public Account(string id, string ten, string ho, double luong)
                {
                    sID = id;
                    sTen = ten;
                    sHo = ho;
                    dLuong = luong;
    
                }
                public void print()
                {
                    Console.WriteLine("Id= {0},Ten={1}, Ho={2}", sID, sTen, sHo);
                }
            }
    
            public class ListAccount
            {
                public ArrayList _listAcccount = new ArrayList();
    
                public void PrintList()
                {
                    foreach (Account ac in _listAcccount)
                    {
                        ac.print();
                    }
                }
            }
    
            public class SortTheoHo : IComparer //Tao 1 class sort theo ho
            {
                int IComparer.Compare(object x, object y)
                {
                    Account _acount1 = x as Account;
                    Account _acount2 = y as Account;
                    return String.Compare(_acount1.sHo, _acount2.sHo);
                }
            }
    
            public class SortTheoTen : IComparer //Tao 1 class sort theo ten
            {
                int IComparer.Compare(object x, object y)
                {
                    Account _acount1 = x as Account;
                    Account _acount2 = y as Account;
                    return String.Compare(_acount1.sTen, _acount2.sTen);
                }
            }
            static void Main(string[] args)
            {
                Account _ac1 = new Account("001", "TenA", "Nguyen", 3000);
                Account _ac2 = new Account("002", "TenB", "Le", 3000);
    
                ListAccount listAcount = new ListAccount();
                listAcount._listAcccount.Add(_ac1);
                listAcount._listAcccount.Add(_ac2);
    
                Console.WriteLine("Before sort....");
                listAcount.PrintList();
    
                listAcount._listAcccount.Sort(new SortTheoHo()); //Sort theo ho
                Console.WriteLine("After sort theo ho....");
                listAcount.PrintList();
    
                listAcount._listAcccount.Sort(new SortTheoTen()); //Sort theo ten
                Console.WriteLine("After sort theo ten....");
                listAcount.PrintList();
    
                Console.ReadLine();
    
            }
        }
    }

4 Likes

Theo như mình thấy thì là do ArrayList của bạn lưu 1 dãy các đối tượng mà bạn chưa Override lại phương thức Sort của nó nên nó không biết cách sort như thế nào, mặc định nó sort các giá trị như String, Int32, Int64, … chứ nếu muốn sort Object thì bạn phải định nghĩa lại phương thức của nó.

1 Like

Em cám ơn a nhiều. V khi em sort theo ID thì e phải thay String bằng gì ạ, e mới học c# nên còn lúng túng phần này quá… :frowning:

ID của e kiểu dữ liệu là gì ??? String.Compare là phương thức dùng để so sánh 2 chuỗi thôi mà.

1 Like

Dạ e để ID là int và Balance e để là float. A cho e hỏi nếu để 2 kiểu đó thì mình phải thay String thành kiểu nào cho phù hợp ạ?

Với kiểu dữ liệu như vậy, thì e so sánh bình thường là được rồi mà.
Ví dụ :


int IComparer.Compare(object x, object y)
{
        Account _acount1 = x as Account;
        Account _acount2 = y as Account;
         if(_acount1.ID>_acount2.ID)
                return 1; //Lớn hơn
         if(_acount1.ID>_acount2.ID)
               return -1;//Nhở hơn
         return 0;//Bằng nhau
}

Dạ, Tại e tưởng là mình dùng theo kiểu return String.Compare() giống trên luôn chứ k cầnn phải viết tường minh ra. Mà mình cho nó tự hiểu như String đc k a?

Mỗi kiểu dữ liệu có 1 cách so sánh riêng mà e.
Hoặc e có thể sử dụng với kiểu Interger như sau, còn kiểu float thì hình như k có

int IComparer.Compare(object x, object y)
{
        Account _acount1 = x as Account;
        Account _acount2 = y as Account;
        return _acount1.ID.CompareTo(_acount2.ID);
}
1 Like

Dạ. Em cám ơn anh nhiều :smile:

Anh ơi cho em hỏi trong một ArrayList em muốn gọi đến một chỉ số của ArrayList thì em phải làm sao a? Ví dụ em tìm người có mức lương cao nhất: Em gọi hàm sắp xếp từ tăng đến giảm. Sau đó, em chỉ in ra người đầu tiên trong danh sách v có được không anh?

E dùng List[0] để lấy phần tử đầu tiên. Các phần tử trong Arraylist đánh số từ 0->n-1, với n là tổng số phần tử.

    //Hàm để xuất Account
         public void Report()
            {
                int i = 0;
                foreach (Account acc in Accounts)
                {
                    Console.WriteLine("STT: {0}", ++i);
                    acc.Query();
                }
            }
    
    
    //Hàm xuất ArrayList
     public void Report()
                {
                    int i = 0;
                    foreach (Account acc in Accounts)
                    {
                        Console.WriteLine("STT: {0}", ++i);
                        acc.Query();
                    }
                }      

//Hàm tìm mức lương        
         public void TimMucLuongMax()
                {
                    Accounts.Sort(new AccountBalanceComparer());
                    //Xuất ra phần tử đầu tiên tức mức lương lớn nhất
                }

Nếu sử dụng List[0] e phải gọi như thế nào mới xuất ra được a???

E thử gọi : Accounts[0].Report() xem đúng k

Dạ. Không đc a. Khi e thực hiện Accounts[0].(Equals, GetHashCode, GetType, ToString thôi a).
Hay tại em gọi nó ở trong class AccountList chứa Report() nên không thể thực hiện lệnh đc???

Ủa, e fai gọi nó ở hàm Main chứ nhỉ ???Sort cũng ở ngoài hàm Main chứ

Dạ k ý em là cài đặt hàm trong một class AccountList rồi sau đó em mới gọi trong hàm main đó a…

acc.TimMucLuongMax();
acc[0].Report();

Nếu e gọi như v trong hàm Main nó vẫn báo lỗi chỗ acc[0] a ơi…

E thử copy toàn bộ code của e lên đây đi e :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?