2008-10-09 12 views
22

Tôi không thực sự nhận được biểu thức lambda. Trong khi họ đã được khoảng từ những ngày của ALGOL, tôi đã không bắt đầu nghe về họ cho đến khi khá gần đây, khi Python và Ruby trở nên rất phổ biến. Bây giờ C# có cú pháp =>, mọi người trong thế giới của tôi (.NET) đang nói về các biểu thức lamdba ngày càng nhiều.Bạn có thể giải thích các biểu thức lambda không?

Tôi đã đọc bài viết trên Wikipedia về phép tính lambda, nhưng tôi không thực sự là một anh chàng toán học. Tôi thực sự không hiểu nó từ góc độ thực tế. Khi nào tôi sẽ sử dụng các biểu thức lambda? Tại sao? Làm thế nào tôi biết rằng đó là những gì tôi nên làm?

Bạn có thể trình bày các ví dụ về cách bạn giải quyết các vấn đề với biểu thức lambda, theo định dạng trước và sau không? Bất kỳ ngôn ngữ bắt buộc nào cũng tốt, nhưng C# sẽ dễ hiểu nhất đối với tôi.

+1

các bản sao http://stackoverflow.com/questions/167343/c-lambda-expression-why-should-i-use-this http://stackoverflow.com/questions/150129/what-is-a -lambda – jop

+0

Cảm ơn, tôi đã đọc những liên kết đó nhưng họ không trả lời câu hỏi của tôi. Câu hỏi của tôi cụ thể hơn một chút là các ví dụ về cách công nghệ đặc biệt này hữu ích và quyết tâm sử dụng đó. –

Trả lời

21

Về cơ bản, theo như C#, biểu thức lambda là một cách dễ dàng để tạo một đại biểu (hoặc một cây biểu thức, nhưng bây giờ chúng ta hãy để chúng lại một lần).

Trong C# 1, chúng tôi chỉ có thể tạo các phiên bản ủy nhiệm từ các phương thức thông thường. Trong C# 2, chúng tôi đã đạt được các phương thức nặc danh. Trong C# 3, chúng tôi đã đạt được các biểu thức lambda, giống như các phương thức ẩn danh ngắn gọn hơn.

Chúng đặc biệt súc tích khi bạn muốn biểu diễn một số logic có một giá trị và trả về một giá trị. Ví dụ: trong ngữ cảnh LINQ:

     // Only include children - a predicate 
var query = dataSource.Where(person => person.Age < 18) 
         // Transform to sequence of names - a projection 
         .Select(person => person.Name); 

Có thảo luận đầy đủ hơn về điều này - cùng với các khía cạnh khác - trong my article on closures.

+0

Tôi thấy câu hỏi này và tôi nghĩ, "Ooo! Có lẽ tôi có thể đánh bại Jon Skeet để đấm!" Nhưng rồi tôi thì không. :) +1 –

+1

mã đó trông khá đẹp, mặc dù tôi đang cân nhắc nếu Chọn là đúng tên. nếu bạn sử dụng Bản đồ, bạn sẽ đến đại số quan hệ trong mã. :) – Tetha

+0

Với tôi, Bản đồ đề xuất việc tạo bản đồ từ khóa đến giá trị, nơi bạn có thể tra cứu bằng khóa. Cá nhân tôi thích Project(). –

0

Việc sử dụng chính các biểu thức lambda trong .NET của tôi là khi làm việc với các danh sách. Sử dụng một biểu thức lambda bạn có thể xây dựng một truy vấn trên một danh sách theo cách tương tự như bạn sẽ xây dựng một câu lệnh SQL để tìm kiếm một bảng cơ sở dữ liệu.

2

hàm lambda chỉ là các hàm ẩn danh.

Ví dụ, trong python, bạn muốn nhân đôi tất cả các phần tử trong một danh sách. Có khá nhiều ba cách để làm như vậy:

List-biểu:

[2*x for x in list] 

chức năng rõ ràng:

def double(x): 
    return 2*x 
map(double, list) # iirc 

với lambdas:

double = lambda x : 2*x 
map(double, list) 

Vì vậy, một lambda trong hầu hết các ngôn ngữ chỉ là một cách để tránh chi phí cú pháp của việc tạo ra một hàm mới.

+2

Nhận xét cuối cùng của bạn không nhất thiết phải đúng. lambdas cũng cung cấp khả năng tạo các bao đóng trên các biến. –

0

Biểu thức lambda là giá trị chức năng (theo nghĩa tương tự 'int' và 'string' là các giá trị). Điều này có nghĩa rằng nó có thể

  • xác định một biến chứa một biểu thức lambda (điều này cũng giống như việc xác định một chức năng)
  • trở lại một biểu thức lambda từ một phương pháp hoặc chức năng
  • gửi một biểu thức lambda làm đối số cho hàm hoặc phương thức

Hãy xem các hàm như bản đồ, bộ lọc hoặc gấp (bằng bất kỳ ngôn ngữ chức năng nào) để xem cách biểu thức lambda được sử dụng làm đối số cho các chức năng khác.