1. Trang chủ
  2. » Công Nghệ Thông Tin

Tuan06 linq basic

27 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

10/6/2019 Lập trình Ứng dụng quản lý LINQ Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query 10/6/2019 Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query Generic Delegates  Tương tự với method, delegate cài đặt theo kiểu generic (nhằm làm tham số hàm chung cho số trường hợp) public delegate void MyDelegate(T param);  Trong NET khai báo sẵn số generic delegate như: Predicate, Action, Comparison,… 10/6/2019 Generic Delegates thông dụng  Predicate sử dụng để kiểm tra giá     trị có thỏa mãn điều kiện khơng trả kiểu bool Action sử dụng để thực hành động với đối tượng mà ta truyền vào không trả giá trị Comparison dùng để so sánh hai đối tượng kiểu, thường sử dụng trường hợp xếp … Ví dụ thường gặp phương thức tĩnh cung cấp class Array Ví dụ  class Array  Phương thức tìm kiếm T[] Array.FindAll(T[] array, Predicate match)  Phương thức duyệt mảng void Array.ForEach(T[] array, Action action)  Phương thức xếp void Array.Sort(T[] array, Comparison comparison) 10/6/2019 Cách sử dụng bool FuncPredicate(int value) { return value % == 0; } StringBuilder sb = new StringBuilder(); void FuncAction(int value) { sb.AppendFormat("{0}, ", value); } int FuncComparison(int x, int y) { return x.CompareTo(y); } void funcTest() { int[] arrInt = new int[] { 3, 5, 7, 2, 10, 43, 12, 34 }; //sử dụng Predicate int[] arrTemp = Array.FindAll(arrInt, new Predicate(FuncPredicate)); //sử dụng Action Array.ForEach(arrInt, new Action(FuncAction)); //sử dụng Comparison Array.Sort(arrInt, new Comparison(FuncComparison)); } Generic Delegates Action Func  Từ C# 3.0, Microsoft cung cấp kiểu delegate linh hoạt tiện dụng Action, Func  Action, Func cho phép khai báo tạo dạng delegate với số lượng tham số kiểu trả khác nhau, tương tự tạo method  Action, Func dùng chủ yếu để tạo lưu trữ anonymous method ngắn gọn lambda expression sử dụng method thông thường 10/6/2019 Syntax  Cú pháp để sử dụng Action, Func viết kiểu tham số giá trị trả vào cặp ngoặc ‘’, theo sau từ khóa Action, Func Action Func  Trong T kiểu tham số cần truyền vào TResult kiểu giá trị trả  Lưu ý Func yêu cầu tham số cặp ‘’, tức phải có kiểu trả Khơng để đặt void hay để cặp ngoặc ‘’ rỗng dùng Func Ví dụ static void DisplayMsg(string msg, Func func, Action action) { ConsoleColor previous = Console.ForegroundColor; if (func != null) { Console.ForegroundColor = func(msg); } int count = (new Random()).Next(2, 5); if (action != null) { action(msg, count); } Console.ForegroundColor = previous; } 10/6/2019 Các method  Cho Func static ConsoleColor GetColor(string msg) { if (msg.Length >= 10) return ConsoleColor.Red; if (msg.Length >= 7) return ConsoleColor.Yellow; if (msg.Length >= 4) return ConsoleColor.Blue; return ConsoleColor.White; }  Cho Action static void PrintMsg(string msg, int count) { for (int i = 0; i < count; i++) { Console.WriteLine(msg); } } Hàm main static void Main(string[] args) { var func = new Func(GetColor); var action = new Action(PrintMsg); DisplayMsg("Test Test", func, action); } 10/6/2019 Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query Anonymous Methods  Anonymous method (tạm dịch phương thức vô danh) phương thức tên khai báo với từ khóa delegate  Anonymous method cho phép tạo hành động cho delegate với cách viết inline  Cụ thể delegate void DelTest(int value); void funcTest() { DelTest dt = delegate(int value) { // }; } 10/6/2019 Truy xuất biến cục  Anonymous method truy xuất tham số ref hay out method cha  Anonymous method khơng có biến cục tên với biến method cha  Anonymous method truy xuất thành phần liệu class chứa  Anonymous method dùng tên biến chung với thành phần liệu class chứa Áp dụng Generic Delegate static void funcTest() { var sb = new StringBuilder(); int[] arrInt = new int[] { 3, 5, 7, 2, 10, 43, 12, 34 }; //sử dụng Predicate int[] arrTemp = Array.FindAll(arrInt, delegate (int value) { return value % == 0; }); //sử dụng Action Array.ForEach(arrInt, delegate (int value) { sb.AppendFormat("{0}, ", value); }); //sử dụng Comparison Array.Sort(arrInt, delegate (int x, int y) { return x.CompareTo(y); }); } 10/6/2019 Áp dụng cho callback method static void Main(string[] args) { var c = new CTest(); c.EvtMyHandler += delegate (object sender, MyEventArgs e) { Console.WriteLine(e.msg); }; c.EvtMyHandler += delegate (object sender, MyEventArgs e) { var str = e.msg.ToUpper(); Console.WriteLine(str); }; } Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query 10/6/2019 Lambda Expressions  Có từ C# 3.0  Có thể nói so với anonymous method, lambda expression coi cải tiến đáng giá từ phiên C# 2.0 lên C# 3.0  Khi dùng anonymous method tạo hàm inline nhằm hạn chế việc khai báo hàm riêng lẻ không cần thiết, giúp mã lệnh ngắn gọn  Với lambda expression viết ngắn gọn dễ dàng nhờ việc cung cấp toán tử cú pháp mới, đồng thời thể “thông minh” compiler cách tự nhận diện kiểu liệu  Ngồi ra, cịn kĩ thuật để tạo kiểu expression tree Syntax  Dạng Lambda Expression sau: (input parameters) => expression  Dấu mở đóng ngoặc tùy chọn trường hợp có tham số, ngược lại bắt buộc  Nếu có nhiều tham số chúng phân cách dấu phẩy (,)  Kiểu liệu tham số khai báo tường minh khơng Nếu khơng khai báo, trình biên dịch tự xác định kiểu, nhiên số trường hợp, cần phải rõ kiểu liệu //sẽ báo lỗi s => s.Length; //cần khai báo kiểu liệu (string s) => s.Length; 10 10/6/2019 Extension Methods  Có từ C# 3.5  Cho phép tạo thêm phương thức cho class mà khơng cần tạo class kế thừa Nói cách khác thực thi hàm thể phương thức lớp đối tượng khác  Được dùng nhu cầu cần thêm số hành xử đối tượng mà thay đổi kiểu đối tượng  Có thể gọi phương thức từ đối tượng null class Cách tạo Extension Method  Phương thức để tạo Extension Method phải thỏa điều kiện:  Là phương thức static static class không kế thừa, khơng generic  Phải có tham số đầu vào  Tham số phải có từ khóa this theo trước  Tham số khơng kèm theo từ khóa out, ref ,… khơng kiểu pointer  Ví dụ: public static class MyExtensionMethod { //extension method cho class object public static bool isNull(this object obj) { return obj == null; } } 13 10/6/2019 Ví dụ tình sử dụng  Có class SinhVien public class SinhVien { public string HoTen{get;set;} public int NamSinh{get;set;} }  Hàm sử dụng class SinhVien public class SVUlti { public static SinhVien SVLonTuoiHon(SinhVien sv1, SinhVien sv2) { return (sv1.NamSinh > sv2.NamSinh) ? sv2 : sv1; } }  Bây sử dụng hàm có mà cần thêm phương thức lấy họ Sinh viên?  Tạo Extension method cho class SinhVien đáp ứng yêu cầu public static class MyExtensionMethod { //extension method cho class SinhVien public static string LayHoSV(this SinhVien sv) { int idx = sv.HoTen.IndexOf(' '); if (idx == -1) idx = sv.HoTen.Length; return sv.HoTen.Substring(0, idx); } }  Khi sử dụng sau var sv1 = new SinhVien { HoTen = "Nguyen Van A", NamSinh = 1992 }; var sv2 = new SinhVien { HoTen = "Tran Thi B", NamSinh = 1993 }; var hoSV = SVUlti.SVLonTuoiHon(sv1, sv2).LayHoSV(); 14 10/6/2019 Tạo extension method khác public static List LayDSHoSV(this List ds) { var l = new List(); foreach (SinhVien sv in ds) { l.Add(sv.LayHoSV()); } return l; } public static List LayDSSVLonTheoNam(this List ds, int nam) { var l = new List(); foreach (SinhVien sv in ds) { if (sv.NamSinh < nam) { l.Add(sv); } } return l; } Mức độ ưu tiên Extension Method  Extension method có độ ưu tiên thấp Instance method Điều có nghĩa có xuất Instance method ln gọi thay Extension method  Ví dụ class SinhVien có phương thức LayHoSV class (instance method) ln sử dụng public class SinhVien { public string HoTen{get;set;} public int NamSinh{get;set;} public string LayHoSV() { return "Ho"; } } 15 10/6/2019 Extension methods NET 3.5  Được sử dụng chủ yếu cho LINQ  Chứa đựng chủ yếu class là: Enumerable Queryable  Hầu hết phương thức từ Enumerable xử lý IEnumerable phương thức từ Queryable xử lý IQueryable  Không phải tất phương thức Enumerable Queryable Extension method Ví dụ  Phương thức Range Enumerable tạo mảng số int theo dạng IEnumerable Đây phương thức tĩnh class //tạo mảng {0, 1, 2, 3, , 9} IEnumerable lstInt = Enumerable.Range(0, 10); //sử dụng phương thức mở rộng lstInt = lstInt.Reverse();  Phương thức Reverse extension method class IEnumerable cài đặt Enumerable Do viết liền sau: IEnumerable lstInt = Enumerable.Range(0, 10) Reverse(); 16 10/6/2019 Phương thức mở rộng Where  Là extension method cho class IEnumerable cài đặt Enumerable  Cung cấp khả lọc (filter) liệu theo điều kiện mong muốn (Predicate)  Xem cách sử dụng: //lấy số lẻ mảng đảo mảng var lstInt = Enumerable.Range(0, 10) Where(x => x % != 0) Reverse();  Cài đặt thực tế extension method Where public static IEnumerable Where(this IEnumerable source, Func predicate) { if (source == null || predicate == null) { throw new ArgumentNullException(); } return WhereImpl(source, predicate); } private static IEnumerable WhereImpl(IEnumerable source, Func predicate) { foreach (T item in source) { if (predicate(item)) { yield return item; } } } 17 10/6/2019 Phương thức mở rộng Select  Là phương thức thông dụng dùng lấy liệu IEnumerable cung cấp extension Enumerable  Nó xử lý IEnumerable đưa liệu vào IEnumerable cách dùng delegate Func  Ví dụ: //lấy đối tượng từ số lẻ mảng đảo mảng var lstInt = Enumerable.Range(0, 10) Where(x => x % != 0) Reverse() Select(x => new { Original = x, Sqrt = Math.Sqrt(x) }); Phương thức mở rộng OrderBy  Cung cấp khả xếp liệu theo tiêu chí lựa chọn  Bao gồm phương thức: OrderBy, OrderByDescending, ThenBy, ThenByDescending  Ví dụ //lấy đối tượng từ mảng số xếp var dsSN = Enumerable.Range(-5, 11) Select(x => new { Org = x, Sqr = x * x }) OrderBy(x => x.Sqr) ThenByDescending(x => x.Org); 18 10/6/2019 Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query Query Expression  Ra đời với C# 3.5 nhằm cung cấp cú pháp (syntax) ngơn ngữ tích hợp (language-integrated) cho lệnh truy vấn tương tự ngôn ngữ truy vấn quan hệ phân cấp SQL, XQuery  Query expression bắt đầu với mệnh đề from kết thúc mệnh đề select group Nói cách khác ln bắt đầu với nguồn liệu kết thúc liệu lựa chọn  Ví dụ var lst = Enumerable.Range(0, 11); var resultQ = from i in lst where i % == select i; 19 10/6/2019 Compiler translations  Là sở tảng Query expression  Mục tiêu thông dịch cú pháp Query expression sang C# code bình thường  Ví dụ câu lệnh query expression ví dụ trước thông dịch dạng var lst = Enumerable.Range(0, 11); var resultQ = lst.Where(i => i % == 0) Select(i => i);  Xét cụ thể ví dụ sau:  Có class Test với phương thức Select public class Test { public Test Select(Func selector) { MyExtensionMethod.sb.AppendLine("Select called "); return new Test(); } }  Xây dựng extension method public static class MyExtensionMethod { public static StringBuilder sb = new StringBuilder(); //extension method cho class Test public static Test Where(this Test test, Func predicate) { sb.AppendLine("Where called "); return test; } } 20 10/6/2019  Sử dụng query expression MyExtensionMethod.sb.Clear(); var temp = new Test(); var rs = from test in temp where test.ToString() == "" select "test";  Bản chất sau thơng dịch rs = temp.Where(x => x.ToString() == "") Select(x => "test");  Kết sb là: “Where called… Select called…” đối tượng rs Test Query Operators  Bản chất extension method Category Restriction Projection Partitioning Join Concatenation Ordering Grouping Set Where Select, SelectMany Take, Skip, TakeWhile, SkipWhile Join, GroupJoin Concat OrderBy / ThenBy, Reverse GroupBy Distinct, Union, Intersect, Except Conversion ToSequence, ToArray, ToList, ToDictionary, ToLookup, OfType, Cast Equality EqualAll First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault, ElementAt, ElementAtOrDefault, DefaultIfEmpty Range, Repeat, Empty Any, All, Contains Count, LongCount, Sum, Min, Max, Average, Aggregate Element Generation Quantifiers Aggregate Operator 21 10/6/2019 Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query Khái niệm LINQ  LINQ đọc LINK, LIN-QUEUE  LINQ: Language Integrated Query  Ra đời từ phiên Net 3.5 gắn liền với Extension Method chức lập trình mới, LINQ trở thành “cầu nối để xóa khoảng cách hai giới: object data”  LINQ cho phép developer thực truy vấn nhiều dạng liệu NET  NET Objects (List, Queue, Array, …)  Database (DLINQ)  XML (XLINQ)  Parallel LINQ (PLINQ) 22 10/6/2019 Phân loại LINQ  LINQ chia thành ba loại dựa vào đối tượng sử dụng  LINQ to Objects  LINQ to XML  LINQ-enabled ADO.NET (LINQ to SQL, LINQ to DataSet LINQ to Entities)  Có thể bổ sung provider để mở rộng nguồn liệu mà LINQ truy vấn Kiến trúc LINQ  Kiến trúc 23 10/6/2019 Syntax  LINQ syntax  Query syntax var q1 = from i in arrI where i % == select i;  Method syntax hay Lambda syntax var q2 = arrI.Where(i => i % == 0) Select(i => i); Cơ sở LINQ  Nền tảng LINQ dựa vào yếu tố quan trọng sau  Implicitly typed local variables (cho phép khai báo biến với kiểu liệu không tường minh)  Object/collection initialization syntax (cú pháp khởi tạo đối tượng, danh sách)  Lambda Expressions  Extension methods  Anonymous types 24 10/6/2019 Expression Tree  Vai trò Expression Tree LINQ Nội dung  Generic Delegates  Anonymous Methods  Lambda Expressions  Extension Method  Query Expression  Khái niệm LINQ  LINQ Query 25 10/6/2019 LINQ Query  Một truy vấn biểu thức để lấy liệu từ nguồn liệu  Truy vấn thường thể ngơn ngữ truy vấn đó: SQL – sở liệu quan hệ, Xquery – XML,…  LINQ đơn giản hóa việc cách cung cấp mơ hình phù hợp để làm việc với liệu nguồn liệu khác Các bước  Thực truy vấn LINQ gồm bước  Tạo nguồn liệu  Tạo truy vấn  Thực truy vấn 26 10/6/2019 LINQPad  Là chương trình hỗ trợ thực thi LINQ query với hầu hết nguồn liệu  Cho phép sử dụng theo syntax (Query Lambda) Bài tập làm với LINQPad  Cho mảng: { 5, 4, 1, 3, 9, 8, 6, 7, 2, } Tạo mảng cho phần tử lớn đơn vị với mảng cho vị trí tương ứng  Cho mảng: { 5, 4, 1, 3, 9, 8, 6, 7, 2, } Hãy cho biết có số lẻ mảng  Cho mảng số { 5, 4, 1, 3, 9, 8, 6, 7, 2, } Hãy xuất mảng số dạng chuỗi (5 “five”, “six”,…)  Cho mảng: { "aPPLE", "BlUeBeRrY", "cHeRry" } Hãy liệt kê mảng với kiểu viết HOA thường  Cho mảng: { 5, 4, 1, 3, 9, 8, 6, 7, 2, } Hãy xuất mảng dạng chuỗi đồng thời cho biết giá trị chẵn hay lẻ 27

Ngày đăng: 09/04/2023, 06:29

Xem thêm:

w