Các hàm tạo dữ liệuRange:tạo 1 dãy số nguyên liên tiếp Các hàm tạo dữ liệu tt Repeat: tạo 1 dãy số chỉ chứa duy nhất 1 giá trị Empty:tạo 1 dãy số có 0 phần tử... Các hàm phân hoạch dữ li
Trang 1C#.NETLINQ (tt)
Trang 3Query syntax - let
let parts = l.Split( ';' )
where parts[0] == server
select new {
Server = parts[0], Url = parts[1]
};
Trang 4Query syntax – join
Có ý nghĩa như phép kết bảng trong cơ
where m.IsStatic == true
orderby m.Name [descending]
select m.Name;
Trang 5Query Syntax – group… by
var query =
from m in
typeof(string).GetMethods()
where m.IsStatic == true
orderby m.Name [descending]
group m by m.Name;
group đã bao hàm ý nghĩa select nên
không cần select nữa
Query Syntax – group… by (tt)
Group nhiều thuộc tính
Trang 6Query Syntax – group… by… into
var query =
from m in typeof(string).GetMethods()
where m.IsStatic == true
orderby m.Name [descending]
group m by m.Name into gr
Trang 7Query Syntax
Các from có thể được viết lồng nhau
var query =
from list in lists
from num in list
Trang 8Lambda Syntax
Bản chất của LINQ là các lệnh truy vấn được
viết dưới dạng lambda syntax
Query syntax dễ đọc, dễ hiểu hơn so với
lambda syntax
Khi thực thi, query syntax sẽ được compiler
chuyển về lambda sysntax
Dùng lambda syntax mới có thể tận dụng
được hết sức mạnh của LINQ
Lambda Syntax (tt)
Các truy vấn LINQ được viết bằng query
syntax hoàn toàn có thể được biểu diễn dưới
dạng lambda syntax
Không có chiều ngược lại
Nên kết hợp query syntax & lambda syntax
Trang 11Phép chiếu
Select
Query Syntax
var query= from c in GetCustomers()
where c.City.StartWith( “A” ) select new { c.City, c.ContactName };
Lambda Syntax
var query = GetCustomers()
Where (c => c.City.StartWith( “A” )) Select(c => new { c.City,
var query = numbers
.Select ((n, idx) => new {idx, n})
Where (item => item.idx % 2 == 0);
Trang 12Phép chiếu SelectMany
SelectMany: dùng “phẳng hoá” tập hợp
Phép chiếu SelectMany (tt)
Trang 13Phép chiếu SelectMany (tt)
Phép chiếu SelectMany (tt)
Trang 14new { s.CouncilCode, s.PostCode }
equals new { h.CouncilCode,
h.PostCode }
select s;
Trang 15Phép kết Join trên nhiều thuộc tính (tt)
Lambda Syntax:
var query =
ShoppingMalls.Join(
Houses,
s => new { s.CouncilCode, s.PostCode },
h => new { h.CouncilCode, h.PostCode },
(s,h) => s
);
Phép toán sắp xếp
OrderBy, OrderByDescending
Trang 18I = grpRow.Count()
Trang 19GroupBy (c => new { c.CategoryID, c.CategoryName })
Select (grpRow => new {
grpRow.Key.CategoryID, grpRow.Key.CategoryName,
I = grpRow.Count()
}
);
Phép gom nhóm (tt)
Trang 20Các hàm tạo dữ liệu
Range:tạo 1 dãy số nguyên liên tiếp
Các hàm tạo dữ liệu (tt)
Repeat: tạo 1 dãy số chỉ chứa duy nhất 1 giá trị
Empty:tạo 1 dãy số có 0 phần tử
Trang 21 Dùng để kiểm tra dãy có chứa phần tử nào thoả điều
kiện X hay không?
Trang 22Các hàm tạo dữ liệu (tt)
All
Dùng để kiểm tra dãy có phải tất cảphần tử của dãy
đều thoả điều kiện X hay không?
Các hàm phân hoạch dữ liệu
Take: lấy n phần tử đầu tiên trong dãy
Skip: bỏ qua n phần tử đầu tiên trong dãy, lấy từ phần
tử thứ (n+1)
Trang 23Các hàm phân hoạch dữ liệu (tt)
TakeWhile: lấy các phần tử đầu cho tới khi thoả điều
First: lấy phần tử đầu tiên trong dãy, “thảy”
InvalidOperationExceptionkhi dãy rỗng
Trang 24Các hàm truy xuất phần tử
First: lấy phần tử đầu tiên trong dãy, “thảy”
InvalidOperationExceptionkhi dãy rỗng
Các hàm truy xuất phần tử (tt)
FirstOrDefault: tương tự như First nhưng trả về null&
ko “thảy” exception khi dãy rỗng
Last, LastOrDefault
Trang 25Các hàm truy xuất phần tử (tt)
Single:
Trả về duy nhất 1 item trong dãy có duy nhất 1 phần
tử
“Thảy” exception khi dãy có nhiều hơn 1 phần tử
Dùng Singleđể ép dãy có 1 phần tử về đối tượng cụ
thể
Các hàm truy xuất phần tử (tt)
Single:
Trang 26Các hàm truy xuất phần tử (tt)
First trả về phần tử đầu tiên trong dãy có >=1
phần tử
Single ép dãy có duy nhất 1 phần tử thành
kiểu đối tượng cụ thể Khi dùng Single ta đã
hàm ý việc kiểm tra xem dãy có chứa nhiều
Take(1) trả về 1 dãy có 1 phần tử lấy từ dãy
gốc
Các hàm truy xuất phần tử (tt)
ElementAt : lấy phần tử thứ i trong dãy
Trang 30Các hàm xử lý tập hợp (tt)
Except : lấy các phần tử thuộc dãy 1 & không
chứa phần giao của 2 dãy
Các hàm xử lý thống kê
Count : trả về số lượng phần tử có trong dãy
Có thể chỉ định điều kiện Count
Trang 32Các hàm xử lý thống kê (tt)
Sum: tính tổng của dãy
Có thể chỉ định thuộc tính để tính tổng
Các hàm chuyển kiểu dữ liệu
ToList, ToArray: chuyển kết quả truy vấn sang List,
Array
Trang 33Các hàm chuyển kiểu dữ liệu (tt)
ToDictionary: chuyển kết quả truy vấn sang Dictionary,
khi dùng hàm này cần chỉ định thuộc tính KEYcho
Dictionary
Các hàm chuyển kiểu dữ liệu (tt)
OfType: lấy ra các phần tử thuộc kiểu dữ liệu nào đó
trong dãy
Trang 34Cho mảng {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"} Tìm tất cả
các số có số ký tự trong tên nhỏ hơn giá trị (vd:
six có số ký tự là 3 < 6)
Cho mảng: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 } Hãy cho
biết mỗi số có ở đúng vị trí nếu mảng được sắp
xếp hay không (giá trị có bằng index hay không)
Luyện tập Query (tt)
Cho mảng {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"} Liệt kê các
phần tử <5 về giá trị
Cho mảng A: { 0, 2, 4, 5, 6, 8, 9 } và mảng B: { 1,
3, 5, 7, 8 } Liệt kê tất cả các cặp phần tử từ A <
phần tử từ B (vd: 0<1, 0<3,…)
Cho mảng: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 } Hãy liệt
kê theo nhóm các phần tử đồng dư với 5
Cho mảng: { "blueberry", "chimpanzee", "abacus",
"banana", "apple", "cheese" } Hãy liệt kê các
Trang 35Luyện tập Query (tt)
Cho mảng: { "cherry", "apple", "blueberry" } Hãy sắp
xếp theo alphabet
Với mảng ở trên hãy sắp xếp theo độ dài chuỗi
Cho mảng: { "aPPLE", "AbAcUs", "bRaNcH",
"BlUeBeRrY", "ClOvEr", "cHeRry" } Hãy sắp xếp theo
alphabet không kể Hoa thường
Cho mảng: { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" } Hãy sắp xếp theo
alphabet rồi sắp xếp theo độ dài chuỗi giảm dần
Cho mảng: { "from ", " salt", " earn ", " last ", " near
", " form " } Hãy gom nhóm các chuỗi giống nhau về
ký tự (ví dụ: “earn ” và “ near ”)
Hãy gom nhóm SinhVien [HoTen, NgaySinh] theo
năm sinh và theo tháng sinh