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.