2008-10-01 5 views
7

Dans un question answer je trouve la pointe de codage suivant: -Expliquer x => x.ToString() // simplifier tant d'appels

2) lambdas simples avec un seul paramètre:

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

Comme quelqu'un qui n'a pas encore utilisé 3.0 je ne comprends pas vraiment ce conseil mais il semble intéressant donc j'apprécierais une expantion sur la façon dont cela simplifie les appels avec quelques exemples.

J'ai fait des recherches lambdas donc je pense Je sais ce qu'ils font, mais je peux pas bien compris si un peu décompactage peut-être aussi dans l'ordre.

Répondre

21

Lorsque vous devez créer une instance d'un délégué qui a un seul paramètre, les expressions lambda permettent de créer ce délégué « en ligne » d'une manière très concise. Par exemple, voici le code pour trouver une personne en particulier dans une liste, par leur nom:

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

En C# 2.0, vous pouvez utiliser une méthode anonyme qui était un peu plus verbeux, mais pas trop mauvais:

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

En C# 1.0, vous devez créer une méthode supplémentaire complète. En outre, si vous vouliez paramétriser, vous auriez à créer un autre type, alors que les méthodes anonymes et les expressions lambda capturent leur environnement d'exécution (variables locales, etc.) afin qu'ils agissent comme des fermetures:

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

Il y a plus à ce sujet dans my article about closures. Bien que le transfert de délégués dans les méthodes ne soit pas très répandu dans C# 2.0 et .NET 2.0, c'est une grande partie de la base de LINQ - vous avez donc tendance à l'utiliser beaucoup en C# 3.0 avec .NET 3.5.

2

Cela élargit essentiellement à:

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

C'est ce que je pensais. Où est-il utile d'appeler directement ToString? –

+0

Tout seul, il ne le fait pas. Cela dépend du contexte dans lequel vous l'utilisez. –

+0

David: Supposons que vous souhaitiez transformer une liste d'entiers en une liste de chaînes. Vous pouvez écrire une routine de transformation généralisée, mais il faut un délégué à appliquer à * chaque * valeur dans la liste - et les expressions lambda facilitent la spécification de ce délégué. –

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

Connaissez-vous les méthodes anonymes C# 2.0? Ces deux appels sont équivalents (en supposant SomeMethod accepte un délégué etc):

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

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

Je sais que je serais plutôt ...

taper
Questions connexes