2011-02-22 67 views
7

Có bắt buộc biểu thức lambda cần phải sử dụng khi LINQ sẽ được sử dụng hoặc biểu thức lambda tùy chọn không?Cú pháp biểu thức Lambda

Trong biểu thức lambda, ký hiệu => luôn được sử dụng. Nó có nghĩa là gì?

customers.Where(c => c.City == "London"); 

Ở đây c => được sử dụng nhưng tại sao? Ý nghĩa của việc sử dụng c =>. Vui lòng thảo luận chi tiết vì tôi không biết lambda.

Trả lời

7

Biểu thức lambda

c => c.City == "London" 

là viết tắt cho cái gì đó như

bool IsCustomerInLondon(Customer c) 
{ 
    return (c.City == "London"); 
} 

Nó chỉ là một cách rất ngắn gọn về cách viết một chức năng đơn giản mà trả về một giá trị. Nó được gọi là "hàm ẩn danh" bởi vì nó không bao giờ được gán một tên hoặc một định nghĩa chính thức (các kiểu tham số và kiểu trả về được suy ra từ ngữ cảnh).

(Trên thực tế, nó không phải chỉ viết tắt; biểu thức lambda có liên quan đến một số cấu trúc khác gọi closures, đó là những công cụ rất mát mẻ và mạnh mẽ.)

+0

Lưu ý rằng các biểu thức lambda cũng có thể được chuyển đổi thành các cây biểu thức. –

11

Không, bạn không để sử dụng biểu thức lambda. Ví dụ: ví dụ Where của bạn có thể được viết là:

private static bool IsLondon(Customer customer) 
{ 
    return customer.City == "London"; 
} 

... 

var londoners = customers.Where(IsLondon); 

Giả sử LINQ đối tượng, tất nhiên. Đối với LINQ to SQL, bạn cần tạo một cây biểu thức. Vì lý do tại sao "=>" luôn được sử dụng trong một biểu thức lambda, đó đơn giản chỉ vì đó là cách mà toán tử được viết - nó giống như hỏi tại sao "+" được sử dụng để bổ sung.

Một biểu thức lambda của "c => ..." là một cách hiệu quả cho các biểu thức lambda một tham số gọi c ... trong trường hợp này chung suy luận kiểu cung cấp loại của c. Phần thân cung cấp một hành động để thực hiện hoặc một số phép tính để trả về một giá trị dựa trên c.

Mô tả đầy đủ về biểu thức lambda nằm ngoài phạm vi của câu trả lời này. Tuy nhiên, với tư cách là một plug trắng cho my book, chúng được đề cập chi tiết trong chương 9 của C# ở độ sâu.

+0

Hah, bạn đã chỉnh sửa ngay trước tôi: p – TimothyP

1

Lambda và LINQ là khá riêng biệt. Bạn có thể sử dụng một trong mà không sử dụng khác (có bộ phận của LINQ mà phụ thuộc vào biểu thức lambda, nhưng chúng tôi muốn giữ nó :-) đơn giản)

Một biểu thức lambda là một chức năng ẩn danh có thể chứa các biểu và các câu lệnh và có thể được sử dụng để tạo các đại biểu hoặc cây biểu thức loại.

Đây là từ MSDN. (http://msdn.microsoft.com/en-us/library/bb397687.aspx)

Để ngắn gọn (phức tạp hơn nhiều), bạn có thể sử dụng biểu thức lambda để tạo hàm cục bộ. những gì bạn đặt trước khi => (trong ví dụ của bạn c) sẽ là tham số của hàm. Kiểu trả về được "phát hiện" bởi trình biên dịch C#.

c => c.City == "London" là gần tương đương với:

delegate (TheObjectTypeOfC c) { 
    return c.City == London 
}; 

(phần chênh lệch được rằng một số biểu thức lambda là đại biểu và cũng biểu thức, nhưng xin vui lòng bỏ qua điều này, bạn sẽ không cần đến nó trong một thời gian)

Nếu/khi trình biên dịch không thể suy ra các loại tham số, bạn có thể ép buộc chúng: (MyObject p) => p.SomeProperty != null. Ở đây bạn đang nói với trình biên dịch rằng p là một tham số.

Trong khi ở đây tôi đã giới thiệu cho bạn những gì được gọi là "biểu hiện lambdas", bạn thậm chí có thể làm "tuyên bố lambdas":

p => { 
    for (int i = 0; i < 10; i++) { 
     if (p.SomeProperty == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

(Tôi sẽ không nói cho bạn biết những gì là "đằng sau hậu trường" khác nhau giữa Nếu bạn muốn biết chúng, hãy đọc trang msdn mà tôi đã chỉ ra trước)

+0

Chúng không phải là * hoàn toàn * riêng biệt, trong đó việc dịch các biểu thức truy vấn (là một phần của LINQ) dựa trên các biểu thức lambda. Tuy nhiên nó * là * công bằng để nói rằng bạn có thể sử dụng các thư viện LINQ mà không sử dụng các biểu thức lambda. –

1

Jon đã trả lời, nhưng tôi muốn thêm cái này.

Trong ví dụ bạn đã đưa ra, hãy tưởng tượng LINQ Looping trên tất cả khách hàng, và c chỉ đơn giản là một tham chiếu đến từng hạng mục trong đếm được:

var result = new List<Customer>(); 
foreach(var c in customers) 
{ 
    if (c.City == "London") 
     result.Add(c); 
} 
return result; 

Đó là một biến giống như bất kỳ khác, nó không có là một tên duy nhất, nhưng nó chỉ là một quy ước của một số loại.

1

bạn không cần sử dụng biểu thức lambda trên Lİnq cho sql hoặc Thực thể; đây là một cách thay thế mã của bạn;

mã bạn:

customers.Where(c => c.City == "London"); 

cách khác;

var query = from cs in customers 
       where cs.City == "London" 
       select cs; 

đây là một cách khác. điêu đo phụ thuộc vao bạn.

4

Hãy suy nghĩ về lambdas là ẩn danh của các hàm. Tôi sẽ cố giải thích nó bằng mã sau.

public bool IsLondon(Customer customer) 
{ 
    return customer.City == "London"; 
} 

Bây giờ chúng ta dải xuống tên hàm và thoát khỏi dấu ngoặc:

public bool Customer customer  
    return customer.City == "London"; 

Chúng ta không cần kiểu trả về, bởi vì trình biên dịch có thể suy ra loại từ biểu:

customer.City == "London"; 

Trong cùng một cách thức trình biên dịch biết về kiểu đầu vào, vì vậy chúng ta không cần phải xác định nó.

Vì vậy, về cơ bản, những gì chúng ta trái với

customer 
    return customer.City == "London"; 

Và cú pháp lambda trong C# cơ bản là:

(parameter list) => "expression" 

Bạn cũng có thể viết "đa-line" biểu thức, nhưng sau đó bạn phải bao quanh mã của bạn với các dấu ngoặc nhọn. Ngoài ra, bạn sẽ cần phải sử dụng câu lệnh "return", như bạn thường làm.

1

Không cần thiết gì cả.

Chúng tôi có hai cách để viết truy vấn LINQ.

Một là phương pháp truy vấn và phương pháp khác là trình tạo. Bạn chỉ cần đặt biểu thức lambda trong trường hợp của phương thức builder. Ví dụ, nếu chúng ta muốn tìm tất cả những sinh viên đến từ một số đối tượng sinh viên có điểm hơn 70. nhưng chúng tôi có thể làm điều này trong LINQ với sau cú pháp

var data = from p in stdList 
    where p.marks > 70 
    select p; 

hoặc var data = stdList.Where (p => p.marks> 70);

phương pháp tiếp cận sau là phương pháp trình tạo, trong trường hợp chức năng, chúng tôi đang chuyển biểu thức lambda.

Biểu thức Lambda chỉ là những điều ngắn gọn khi làm những việc bạn có thể sử dụng LINQ truy vấn, nhưng nếu bạn muốn tránh cú pháp truy vấn chỉ cần áp dụng điều kiện đơn giản, bạn có thể sử dụng phương thức trình xây dựng LINQ (yêu cầu biểu thức lambda) biểu thức, bạn luôn xác định một số bí danh và sau đó thực hiện thao tác của bạn.

Theo như toán tử => có liên quan, Nó hoạt động giống như toán tử gán. Ví dụ:

(p) => p.Gender == “F” 
It means “All persons p, such that person’s Gender is F” 

Trong một số tài liệu này được gọi là "vị ngữ". Một thuật ngữ văn học khác là “Chiếu”

(p) => p.Gender ? “F” : “Female” 
“Each person p becomes string “Female” if Gender is “F”” 

Đây là phép chiếu, nó sử dụng toán tử bậc ba. Mặc dù tôi đã giải thích với các ví dụ rất cơ bản nhưng tôi hy vọng điều này sẽ giúp bạn. . . :)

Các vấn đề liên quan