02/10/2018, 00:45
[C#] LINQ trong CSharp - Phần hai
Tiếp theo của phần một - LINQ la gi ? - trong phần này sẽ giới thiệu các phương thức: Grouping, Set, Conversion (import) và Conversion (export). Ordering LINQ (sắp xếp): OrderByDescending: Sắp xếp các element theo thứ tự giảm dần theo khóa khai báo. ...
Tiếp theo của phần một - LINQ la gi ? - trong phần này sẽ giới thiệu các phương thức: Grouping, Set, Conversion (import) và Conversion (export).
- Ordering LINQ (sắp xếp):
- OrderByDescending: Sắp xếp các element theo thứ tự giảm dần theo khóa khai báo.
- ThenBy: Sắp xếp các element theo thứ tự tăng dần theo khóa khai báo, sau khi sắp xếp theo khóa trước đó.
var query = dsSach.OrderBy(x => x.MaChuDe).ThenBy(x => x.TenSach);
- ThenByDescending: Sắp xếp các element theo thứ tự giảm dần theo khóa khai báo, sau khi sắp xếp theo khóa trước đó.
- Reverse: Đảo ngược thứ tự sắp xếp các element trong sequence.
var query = dsSo.OrderBy(x => x).Reverse();
- Grouping LINQ (Nhóm):
- GroupBy: Nhóm các element theo một bộ khóa cụ thể:
var query = dsSach.GroupBy(x => x.MaChuDe) .Select(x => new { x.Key, sosp = x.Count() }); //Cho biết số lượng sách của từng Chủ đề, gồm: Mã chủ đề, tên chủ đề, Số lượng var query = dsSach.GroupBy(x => new { x.MaChuDe, x.ChuDe.TenChuDe }) .OrderBy(x => x.Key.MaChuDe) .Select(x => new { x.Key.MaChuDe, x.Key.TenChuDe, soluong = x.Count() });
- Set LINQ (tập hợp):
- Concat: Nối 2 sequence lại. Phương thức này tương đương với UNION ALL trong SQL.
//Nối 2 chuỗi dsChuoi1 với dschuoi List dsChuoi1 = new List(){"Đã mang lấy nghiệp vào thân","Cũng đừng trách lẫn trời gần trời xa."}; var query = dsChuoi1.Concat(dsChuoi);
- Union: Hội kết quả của 2 sequence và loại bỏ các element trùng lắp. P.thức này tương đương với UNION trong SQL.
//trả về kết quả chứa các số duy nhất của hai mảng int[] dsSo2 = { 0, 2, 4, 5, 6, 8, 9 }; var query = dsSo.Union(dsSo2);
- Intersect: Hội kết quả của 2 sequence và chỉ lấy các element trùng lắp. Phương thức này tương đương với WHERE ... IN ... trong SQL.
//trả về kết quả chứa các số giống nhau của hai mảng int[] dsSo2 = { 0, 2, 4, 5, 6, 8, 9 }; var query = dsSo.Intersect(dsSo2);
- Except: Hội kết quả của 2 sequence và chỉ lấy các element nào của sequence thứ nhất mà không có trong sequence thứ 2. Phươngthức này tương đương với EXCEPT hoặc WHERE ... NOT IN ... trong SQL.
//trả về kết quả chứa các số của mảng dsSo2 mà không có trong dsSo int[] dsSo2 = { 0, 2, 4, 5, 6, 8, 9 }; var query = dsSo2.Except(dsSo);
- Conversion LINQ (import):
- OfType: Lọc các element kiểu IEnumerable thỏa điều kiện kiểu xác định. Nói cách khác là chuyển kiểu IEnumerable sang IEnumerable và sẽ không chuyển các element khác kiểu T
//Lọc các element có kiểu string ArrayList ds = new ArrayList() { "Mango","Orange","Apple",3.0, "Banana", true, 100 }; IEnumerable query = ds.OfType();
- Cast: Chuyển kiểu các element kiểu IEnumerable sang kiểu xác định, tuy nhiên nó sẽ báo lỗi nếu không chuyển được vì có element sai kiểu.
//nếu dùng lại ví dụ trên IEnumerable query = ds.Cast(); //Lỗi run-time //nhưng nếu khai báo lại nguồn dữ liệu như sau thì sẽ không còn lỗi ArrayList ds = new ArrayList() { "Mango","Orange","Apple", "Banana" };
- Conversion LINQ (Export):
- ToArray: Tạo ra một mảng từ một IEnumerable.
//tạo một mảng từ kiểu List var query = dssp.ToArray(); //Vừa tạo, vừa thi hành truy vấn
- ToList: Tạo ra một List từ một IEnumerable.
Sanpham[] dssp ={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" } }; //tạo một List từ kiểu mảng Sanpham var query = dssp.ToList(); //tạo một List từ kiểu mảng Sanpham var query = dssp.Select(x => x.Tensp).ToList();
- ToDictionary: Tạo ra một Dictionary từ một IEnumerable dựa theo một bộkhóa xác định:
//tạo một Dictionary từ kiểu mảng var spApple = (new[]{ new {Ten="iPhone",Dg=17}, new {Ten="iPad",Dg=10},new {Ten="iPod",Dg=2}, new {Ten="Mac laptop",Dg=25}, }).ToDictionary(x => x.Ten); //lấy Ten làm khóa, do đó nếu có giá trị trùng nhau thì sẽ bị lỗi run-time
- ToLookup: Tạo ra một Lookup từ một IEnumerable dựa theo một bộ khóa xác định. Điểm khác nhau so với ToDictionary là cho phép trùng Key:
List dssp = new List {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" } }; //câu lệnh sẽ bị lỗi lúc run-time vì trùng khóa var query = dssp.ToDictionary(x => x.Nhomsp); //Dòng lệnh này sẽ không bị lỗi var query = dssp.ToLookup(x => x.Nhomsp); Ví dụ khác: Nhóm theo ký tự đầu tiên của thuộc tính Nhomsp //Cũng có thể dùng ILookup và nhóm các element lại: ILookup query = dssp.ToLookup(k => Convert.ToChar( k.Nhomsp.Substring(0,1)), v => v.Tensp); StringBuilder stb = new StringBuilder(); //Khi thi hành truy vấn, dùng kiểu IGrouping foreach (IGrouping q in query) { stb.AppendLine(q.Key.ToString()); foreach(string str in q ) stb.AppendLine(" " +str); }
- AsEnumerable: Trả về input có kiểu IEnumerable.
IEnumerable query = dsChuoi.AsEnumerable().Where(x => x == "chữ");
- AsQueryable : Chuyển kiểu IEnumerable sang kiểu IQueryable.
IQueryable query = dsChuoi.AsQueryable().Where(x => x == "chữ");
Xem tiếp Phần ba !
HAPPY CODING :))