[C#] LINQ trong CSharp - Phần cuối
Tiếp theo của Phần hai, tiếp tục sẽ là các phương thức cơ bản của LINQ trong C# : Element, Aggregation, Quantifiers, Generation. Element LINQ (Phần tử): First: Trả về element đầu tiên trong sequence. Tương đương SELECT TOP 1...ORDER BY...: ...
Tiếp theo của Phần hai, tiếp tục sẽ là các phương thức cơ bản của LINQ trong C#: Element, Aggregation, Quantifiers, Generation.
- Element LINQ (Phần tử):
- First: Trả về element đầu tiên trong sequence. Tương đương SELECT TOP 1...ORDER BY...:
//Trả về chuỗi đầu tiên có ký tự bắt đầu bằng t trong dsChuoi string query = dsChuoi.First(x => x.StartsWith("t"));
- FirstOrDefault: Trả về element đầu tiên trong sequence hoặc giá trị mặc định nếu sequence không chứa element nào.
//Trả về null nếu không có element nào thỏa điều kiện string query = dsChuoi.FirstOrDefault(x => x.StartsWith("z")); //Trả về 0 nếu không có element nào có gái trị bằng 10 int query = dsSo.FirstOrDefault(x => x==10);
- Last: Trả về element cuối cùng trong sequence. Tương đương SELECT TOP 1...ORDER BY... DESC.
- LastOrDefalut: Trả về element cuối cùng trong sequence hoặc giá trị mặc định nếu sequence không chứa element nào.
- Single: Trả về chỉ duy nhất một element trong sequence và sẽ ném ngoại lệ nếu có hơn 1 element.
//lỗi vì có nhiều element thỏa điều kiện string query = dsChuoi.Single(x => x.StartsWith("t")); //Lỗi vì dschuoi có nhiều element string query = dsChuoi.Single(); //OK vì chỉ có 1 element thỏa điều kiện string query = dsChuoi.Single(x => x.StartsWith("k"));
- SingleOrDefault: Trả về chỉ duy nhất một element trong sequence hoặc giá trị mặc định nếu sequence rỗng. Nó sẽ ném ngoại lệ nếu có hơn một element.
//Trả về null nếu không có element nào thỏa điều kiện string query = dsChuoi.SingleOrDefault(x => x.StartsWith("z")); //Trả về 0 nếu không có element nào có gái trị bằng 10 int query = dsSo.SingleOrDefault(x => x==10);
- ElementAt: Trả về element ở chỉ số xác định trong sequence.
//lấy element thứ 2 trong dschuoi string query = dsChuoi.ElementAt(1);
- ElementAtOrDefault: Trả về element ở chỉ số xác định trong sequence hoặc giá trị mặc định nếu chỉ số nằm ngoài sequence.
//Trả về 0 nếu không vì chỉ số 50 vượt quá số element trong sequence int query = dsSo.ElementAtOrDefault(50);
- DefaultIfEmpty: Trả về các element của một sequence xác định, hoặc giá trị mặc định trong một collection nếu sequence rỗng.
Pet defaultPet = new Pet { Name = "Default Pet", Age = 0 }; //Tạo một danh sách có phần tử List<Pet> pets1 = new List<Pet>{ new Pet { Name="Barley", Age=8 }, new Pet { Name="Boots", Age=4 }, new Pet { Name="Whiskers", Age=1 } }; var query = pets1.DefaultIfEmpty(); StringBuilder stb = new StringBuilder(); foreach (var s in query) stb.AppendLine(s.Name); //Tạo một danh sách rỗng List<Pet> pets2 = new List<Pet>(); //Sequence rỗng thì nó sẽ lấy defaultPet var query2 = pets2.DefaultIfEmpty(defaultPet); foreach (var s in query2) stb.AppendLine(s.Name);
- Aggregation LINQ (Thống kê):
- Aggregate: Tính toán tích lũy trong sequence (thống kê tùy ý).
//Bài toán sum int kq = dsSo.Aggregate( (Sohientai, Soketiep) => Sohientai+Soketiep ); //Dùng tham số Seed để khởi tạo giá trị tích lũy ban đầu là 2 int kq = dsSo.Aggregate(2, (Sohientai, Soketiep) => (Sohientai + Soketiep) ); //Đảo ngược lại các element trong dsChuoi string str = dsChuoi.Aggregate((chuoihientai, chuoiketiep) => chuoiketiep+ " " + chuoihientai);
- Average: Tính trung bình của một sequence.
//Tính trung bình các số trong dsSo double tb = dsSo.Average(); //Tính đơn giá trung bình sản phẩm Apple SpApple[] dssp = {new SpApple {Ten="iPhone",Dg=17}, new SpApple {Ten="iPad",Dg=10}, new SpApple {Ten="iPod",Dg=2}, new SpApple {Ten="Mac Laptop",Dg=25} }; double tb = dssp.Average(x => x.Dg); //Lớp hỗ trợ class SpApple { public string Ten { get; set; } public int Dg { get; set; } }
- Count: Trả về số lượng element trong sequence.
List<Sanpham> dssp = new List<Sanpham> {new Sanpham { Tensp = "Xà lách", Nhomsp="Rau cải" },new Sanpham { Tensp = "Cua biển", Nhomsp="Hải sản" },new Sanpham { Tensp = "Đậu xanh", Nhomsp="Ngũ cốc" } ,new Sanpham { Tensp = "Tôm càng", Nhomsp="Hải sản" } }; //Đếm số lượng sản phẩm theo từng Nhomsp var query = dssp.GroupBy(x => x.Nhomsp) .Select(x => new {x.Key, sosp= x.Count() }); //Đếm số lượng sản phẩm của Nhomsp là “Hải sản” int dem = dssp.Count(x => x.Nhomsp == "Hải sản");
- LongCount: Trả về số lượng element trong sequence, kiểu dữ liệu là Int64.
long dem = dssp.LongCount(x => x.Nhomsp == "Hải sản");
- Sum: Tính tổng của các element kiểu số trong một sequence.
//Tính tổng trị giá các sản phẩm Apple int tong = dssp.Sum(x => x.Dg); //Tính tổng trong dsSo int tong = dsSo.Sum();
- Max: Trả về giá trị lớn nhất trong sequence.
- Min: Trả về giá trị nhỏ nhất trong sequence.
//Tìm số lớn nhất trong dsSo int max = dsSo.Max(); //Tìm đơn giá nhỏ nhất trong danh sách sản phẩm Apple int min = dssp.Min(x => x.Dg); //Tìm giá trị nhỏ nhất trong dsChuoi string str = dsChuoi.Min();
- Quantifiers LINQ (định lượng, lượng hóa):
- All : Xác định tất cả các element của sequence có thỏa điều kiện hay không. Trả về kiểu bool.
//Tất cả các element trong dsSo có lớn 5 không? bool kq = dsSo.All(x => x > 5); //Tất cả các sản phẩm trong nhóm sp có chứa chữ ‘u’ List<Sanpham> dssp = new List<Sanpham> { new Sanpham { Tensp = "Xà lách", Nhomsp="Rau cải" }, new Sanpham { Tensp = "Cua biển", Nhomsp="Hải sản" }, new Sanpham { Tensp = "Đậu xanh", Nhomsp="Ngũ cốc" } , new Sanpham { Tensp = "Tôm càng", Nhomsp="Hải sản" } }; var query = dssp.GroupBy(x => x.Nhomsp) .Where(x => x.All( y=> y.Tensp.Contains('u')));
- Any: Xác định sequence có chứa element nào thỏa điều kiện không. Trả về kiểu bool.
//Xem dsSo có element nào không? bool kq = dsSo.Any(); //true //Trong nhóm sản phẩm tồn tại ít nhất 1 s.phẩm chứa chữ 'u' var query = dssp.GroupBy(x => x.Nhomsp) .Where(x => x.Any(y => y.Tensp.Contains('u')));
- Contains: Xác định sequence có chứa element nào không dựa trên giá trị truyền vào. Trả về kiểu bool
(xem thêm ví dụ trên)
bool kq = dsChuoi.Contains("Tâm"); //True
- SequenceEqual: Xác định 2 sequence có bằng nhau không. Trả về kiểu bool.
string[] dsA = { "cherry", "apple", "blueberry" }; string[] dsB = { "apple", "blueberry", "cherry" }; bool kq = dsA.SequenceEqual(dsB); //False
- Generation LINQ (phát sinh):
- Empty: Trả về một IEnumerable<T> rỗng có tham số được định kiểu.
//Phát sinh một IEnumerable<string> rỗng IEnumerable<string> empty = Enumerable.Empty<string>();
- Range: Phát sinh một sequence chứa các số nguyên trong một miền giá trị xác định.
//Phát sinh một IEnumerable<int> có 3 số nguyên, bắt đầu từ 4 IEnumerable<int> squares = Enumerable.Range(4, 3).Select(x => x * x); //Nếu in kết quả ra màn hình, ta thấy là: 16 25 36
- Repeat: Phát sinh một sequence chứa một giá trị được lặp lại.
//Phát sinh một IEnumerable<string> chứa 10 chuỗi “Tôi thích lập trình” IEnumerable<string> sts = Enumerable.Repeat("Tôi thích lập trình", 10);
Kết: Trên đây là các phương thức cơ bản của LINQ sử dụng trong truy vấn tới các Object của dotNet. Thành thạo các phương thức này sẽ giúp các coder nhanh chóng xử lý những tác vụ và giới hạn các object dotNet không cho phép làm trong một câu lệnh. Như Array thì không thể sắp xếp, hay ArrayList thì không thể lấy ra phần tử có giá trị lớn nhất, v.v... Chúc các bạn sớm rành LINQ.
Xem lại Phần một: LinQ la gi ?
HAPPY CODING :))