Biểu thức Lambda


Biểu thức lambda là một phương cách mới trong việc tạo các hàm vô danh (anonymous). Nó có thể chứa các câu lệnh cũng như các biểu thức khác. Một biểu thức Lambda trả về kết quả của một biểu thức và có dạng như sau:

(input parameters) => expression

Dấu mở và đóng ngoặc là tùy chọn trong trong trường hợp chỉ có 1 tham số, ngược lại nó là bắt buộc. Nếu có nhiều hơn 1 tham số thì chúng sẽ được phân cách bằng dấu phẩy (,). Kiểu của các tham số có thể được khai báo tường minh hoặc không, nếu không khai báo, trình duyệt sẽ tự xác định kiểu, tuy nhiên trong một số trường hợp, bạn phải chỉ rõ kiểu của nó, ví dụ:

s => s.Length (lỗi, vì trình dịch không thể biết được s là gì)

bạn khải khai báo như sau:

(string s) => s.Length

Một biểu thức lambda dùng toán tử =>, mang ý nghĩa như là “đi đến”. Phía bên trái của toán tử là các tham số (nếu có), bên phải là các biểu thức hay câu lệnh. Ví dụ như biểu thức lambda x => x * x sẽ tương đương với hàm sau:

int f(int x) {

return x * x;

}

Một biểu thức lambda có thể được dùng để tạo các delegate giống như sau:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5);

Toán tử => có cùng độ ưu tiên như phép gán = và được xét từ phải sang trái, do vậy câu lệnh d = x => x * x sẽ có ý nghĩa khác với x => d = x * x. Ở câu lệnh thứ nhất, d sẽ có kiểu delegate và nó đại diện cho biểu thức lambda x => x*x, câu lệnh thứ 2 hoàn toàn là 1 biểu thức lambda, trong đó d sẽ mang giá trị của bình phương giá trị được truyền vào.

Các biểu thức lambda thường được dùng trong các câu truy vấn LINQ như là các tham số của các mệnh đề truy vấn kiểu như Where.

Các biểu thức lambda không được phép xuất hiện bên trái toán tử is hay as. Và các hạn chế của phương thức anonymous cũng được áp dụng cho biểu thức lambda.

Trong phần thân của một biểu thức lambda, bạn có thể thực hiện các lời gọi hàm, tuy nhiên cần chú ý là nếu biểu thức của bạn sẽ được thực thi trong một môi trường khác, kiểu như thực thi bên trong SQL Server, bạn không được dùng các lời gọi hàm vì các phương thức bạn gọi có thể không có ý nghĩa trong môi trường đó. Ví dụ như biểu thức sau có thể sẽ không dùng được nếu được viết bên trong một thủ tục CLR:

(int x) => { MessageBox.Show(x.ToString()); return x * 10; };

Các biểu thức lambda có thể không trả về giá trị, chẳng hạn: (string s) =>{ System.Console.Write(s.Length); };

When you use method-based syntax to call the Where“1(IEnumerable<(Of <(UMP>)>), Func<(Of <(UMP, Boolean>)>)) method in the Enumerable class (as you do in LINQ to Objects and LINQ to XML) the parameter is a delegate type System..::.Func<(Of <(T, TResult>)>). A lambda expression is the most convenient way to create that delegate. When you call the same method in, for example, the Queryable class (as you do in LINQ to SQL) then the parameter type is an System.Linq.Expressions..::.Expression<Func> where Func is any Func delegates with up to five input parameters. Again, a lambda expression is just a very concise way to construct that expression tree. The lambdas allow the Where calls to look similar although in fact the type of object created from the lambda is different.

In the previous example, notice that the delegate signature has one implicitly-typed input parameter of type int, and returns an int. The lambda expression can be converted to a delegate of that type because it also has one input parameter (x) and a return value that the compiler can implicitly convert to type int. (Type inference is discussed in more detail in the following sections.) When the delegate is invoked by using an input parameter of 5, it returns a result of 25.

Lambdas are not allowed on the left side of the is or as operator.

All restrictions that apply to anonymous methods also apply to lambda expressions. For more information, see Anonymous Methods (C# Programming Guide).

10 thoughts on “Biểu thức Lambda

  1. Cảm ơn anh Hải Nam, các bài viết của anh rất hưu ích cho em-mới tìm hiểu về linq.

  2. E là fan hâm mộ các bài viết của a đó, a dịch rất dễ hiểu. Phải chi bộ sách asp.net của bác Dương Quang Thiện mà đưa cho a dịch thì hay biết mấy.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s