Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Hướng dẫn sử dụng OrderBy và GroupBy trong C# (LINQ)

Tổng quan

  • OrderBy: Sắp xếp mảng/collection theo thứ tự tăng dần hoặc giảm dần.
  • GroupBy: Thuộc nhóm Grouping Operators. Lấy một chuỗi phẳng, tổ chức thành các nhóm (IGrouping<K,V>) dựa trên khóa cụ thể và trả về các nhóm chuỗi.

Ví dụ GroupBy

class ElectronicGoods 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    
    public static List<ElectronicGoods> GetElectronicItems() 
    {
        return new List<ElectronicGoods>() 
        {
            new ElectronicGoods { Id = 1, Name = "Mobile", Category = "Phone" },
            new ElectronicGoods { Id = 2, Name = "LandLine", Category = "Phone" },
            new ElectronicGoods { Id = 3, Name = "Television", Category = "TV" },
            new ElectronicGoods { Id = 4, Name = "Grinder", Category = "Food" },
            new ElectronicGoods { Id = 5, Name = "Mixer", Category = "Food" },
        };
    }
}

class Program 
{
    static void Main() 
    {
        // Group by Category và sắp xếp tên trong mỗi nhóm
        var result = ElectronicGoods.GetElectronicItems()
            .GroupBy(x => x.Category)
            .Select(x => new 
            {
                Key = x.Key,
                Items = x.OrderBy(c => c.Name)
            });

        foreach (var group in result) 
        {
            Console.WriteLine($"{group.Key} - {group.Items.Count()}");
            Console.WriteLine("----------");
            foreach (var item in group.Items) 
            {
                Console.WriteLine($"{item.Name}\t{item.Category}");
            }
            Console.WriteLine();
        }
    }
}

Kết quả GroupBy

Phone - 2
----------
LandLine    Phone
Mobile      Phone

TV - 1
----------
Television  TV

Food - 2
----------
Grinder     Food
Mixer       Food

Ví dụ OrderBy

var result = ElectronicGoods.GetElectronicItems()
    .OrderBy(x => x.Category);

foreach (var item in result) 
{
    Console.WriteLine($"{item.Name}\t{item.Category}");
}

Kết quả OrderBy

Grinder     Food
Mixer       Food
Mobile      Phone
LandLine    Phone
Television  TV

Mở rộng: OrderByDescending, ThenBy, ThenByDescending

// Sắp xếp giảm dần theo Category, sau đó tăng dần theo Name
var result = items
    .OrderByDescending(x => x.Category)
    .ThenBy(x => x.Name);

Lưu ý hiệu năng

  • OrderBy sử dụng thuật toán QuickSort ổn định (stable sort).
  • GroupBy tạo ra lookup table nội bộ, phù hợp cho dữ liệu vừa và nhỏ. Với dữ liệu lớn, cân nhắc dùng ToLookup hoặc xử lý theo batch.