2008-10-01 21 views
7

Trong một question answer Tôi tìm thấy mũi mã hóa sau đây: -Giải thích x => x.ToString() // đơn giản hóa rất nhiều cuộc gọi

2) lambdas đơn giản với một tham số:

x => x.ToString() //simplify so many calls 

Là một những người chưa sử dụng 3,0 Tôi không thực sự hiểu mẹo này nhưng nó có vẻ thú vị vì vậy tôi sẽ đánh giá cao một expantion về cách này đơn giản hóa các cuộc gọi với một vài ví dụ.

Tôi đã nghiên cứu lambdas vì vậy tôi nghĩ rằng Tôi biết những gì họ làm, tuy nhiên tôi có thể không hoàn toàn hiểu do đó, một giải nén chút cũng có thể là theo thứ tự.

Trả lời

21

Khi bạn cần tạo một thể hiện của một đại biểu trong đó có một tham số duy nhất, biểu thức lambda cho phép bạn tạo mà đại biểu "inline" một cách rất ngắn gọn. Ví dụ, đây là mã để tìm thấy một người đặc biệt trong một danh sách, bởi tên của họ:

List<Person> list = new List<Person>(); 
// [..] Populate list here 
Person jon = list.Find(p => p.Name == "Jon"); 

Trong C# 2.0, bạn có thể sử dụng một phương pháp vô danh đó là longwinded hơn một chút, nhưng không quá xấu:

List<Person> list = new List<Person>(); 
// [..] Populate list here 
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; }); 

Trong C# 1.0, bạn phải tạo ra toàn bộ phương thức bổ sung. Ngoài ra, nếu bạn muốn parameterise nó, bạn sẽ phải tạo ra một loại khác nhau, trong khi đó phương pháp vô danh và biểu thức lambda chụp môi trường thực thi của họ (các biến địa phương vv) để họ hành động như đóng cửa:

public Person FindByName(List<Person> list, String name) 
{ 
    return list.Find(p => p.Name == name); // The "name" variable is captured 
} 

Có nhiều về điều này trong my article about closures.

Trong khi chuyển giao đại biểu vào các phương pháp không phải là rất phổ biến trong C# 2.0 và .NET 2.0, đó là một phần lớn của cơ sở LINQ - vì vậy bạn có xu hướng sử dụng nó rất nhiều trong C# 3.0 với .NET 3.5.

2

này về cơ bản mở rộng để:

private string Lambda(object x) { 
    return x.ToString(); 
} 
+0

Đó là những gì tôi nghĩ. Làm cách nào để giúp gọi điện trực tiếp ToString? –

+0

Không phải tất cả. Nó phụ thuộc vào ngữ cảnh bạn sử dụng nó. –

+0

David: Giả sử bạn muốn chuyển đổi một danh sách các số nguyên thành một danh sách các chuỗi. Bạn có thể viết một thói quen chuyển đổi tổng quát, nhưng nó cần một đại biểu để áp dụng cho * mỗi giá trị * trong danh sách - và các biểu thức lambda giúp dễ dàng xác định ủy nhiệm đó hơn. –

0
string delegate(TypeOfX x) 
{ 
    return x.ToString(); 
} 
1

Bạn có quen thuộc với phương thức ẩn danh C# 2.0 không? Hai gọi là tương đương (giả sử SomeMethod chấp nhận một đại biểu vv):

SomeMethod(x => x.ToString()); 

SomeMethod(delegate (SomeType x) { return x.ToString();}); 

tôi biết mà tôi thà gõ ...

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