2008-10-01 10 views
7

W question answer znajdę końcówkę następujące kodowania: -Wyjaśnić x => x.ToString() // uprościć tak wiele połączeń

2) proste lambdy z jednym parametrem:

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

jak ktoś kto jeszcze nie używał wersji 3.0 Naprawdę nie rozumiem tej wskazówki, ale wygląda ciekawie, więc byłbym wdzięczny za wyjaśnienie, w jaki sposób upraszcza to połączenia za pomocą kilku przykładów.

mam zbadane lambdy więc myślę wiem, co robią, ale ja może nie w pełni zrozumieć, więc trochę rozpakowywanie może być również w porządku.

Odpowiedz

21

Kiedy trzeba utworzyć wystąpienie delegata, który ma jeden parametr, wyrażenia lambda pozwala na tworzenie tego delegata „inline” w bardzo zwięzły sposób. Na przykład, oto kod, aby znaleźć konkretną osobę na liście, o nazwie:

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

W języku C# 2.0 można użyć anonimowego sposobu, który był trochę bardziej rozwlekłości, ale nie zbyt złe:

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

W języku C# 1.0 trzeba utworzyć całą dodatkową metodę. Ponadto, jeśli chciał go parametryzacji, trzeba by utworzyć inny typ, natomiast anonimowe metody i wyrażenia lambda uchwycić ich środowiska wykonującego (zmienne lokalne itp), więc działają one jak zamknięć:

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

Jest więcej o tym w my article about closures.

Podczas przekazywania uczestników do metod nie jest strasznie często w C# 2.0 i .NET 2.0, jest to duża część podstaw LINQ - więc często używasz go w C# 3.0 z .NET 3.5.

2

To zasadniczo rozszerza się:

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

Tak właśnie myślałem. Gdzie to pomaga przez wywoływanie ToString bezpośrednio? –

+0

Wszystko samo w sobie nie działa. To zależy od kontekstu, w którym go używasz. –

+0

David: Załóżmy, że chcesz przekształcić listę liczb całkowitych na listę ciągów. Możesz napisać uogólnioną procedurę transformacji, ale potrzebuje delegata, aby zastosować do * każdej * wartości na liście - a wyrażenia lambda ułatwiają określenie tego delegata. –

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

Czy znasz metody anonimowe C# 2.0? Te dwa połączenia są równoważne (zakładając SomeMethod akceptuje delegata ETC):

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

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

wiem który wolałbym type ...