web-dev-qa-db-fra.com

Est-ce Linq ou Lambda?

Je sais que c'est Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

Et je sais que c'est Lambda:

var _Results = _List.Where(x => x.Value == 1);

NDLR: ce qui précède n'est pas simplement Lambda, c'est Linq utilisant la "Syntaxe de méthode" dont le prédicat est un Lambda. Pour être clair, les deux exemples ci-dessus sont Linq (mon message d'origine était incorrect, mais j'ai laissé l'erreur pour illustrer la confusion suscitant la question).

Mais Linq est-il un sous-ensemble de Lambda ou quoi?

Pourquoi y a-t-il deux technologies apparemment identiques?

Y a-t-il une raison technique de choisir l'un plutôt que l'autre?

96
Jerry Nixon - MSFT

C'est LINQ (en utilisant la syntaxe de requête):

var _Results = from item in _List
                where item.Value == 1
                select item;

C'est aussi LINQ (en utilisant la syntaxe de la méthode):

var _Results = _List.Where(x => x.Value == 1);

Il est intéressant de noter que ces deux versions finira par produire exactement le même code. Le compilateur vous offre un service en vous permettant d'exprimer vos souhaits de la manière que vous préférez.

Et ceci est un lambda:

x => x.Value == 1

Lorsque vous choisissez d'utiliser la syntaxe de méthode, LINQ est presque toujours visible autour des expressions lambda. Mais LINQ et lambdas sont deux choses totalement différentes, qui peuvent toutes deux être utilisées seules.

Mise à jour: Comme le souligne à juste titre svick, LINQ avec la syntaxe de requête est aussi implémenté à l'aide d'expressions lambda (comme mentionné précédemment, le compilateur vous permet d'écrire dans la syntaxe de requête mais la transforme efficacement en syntaxe de méthode derrière votre dos). Cela ne fait qu'empiler le fait que les deux saveurs sont totalement équivalentes et se comporteront de la même manière (par exemple, les expressions lambda peuvent provoquer la création de fermetures ).

125
Jon

Les deux sont Linq. Le second est en utilisant Lambdas .

Les lambdas sont les éléments de type méthode en ligne que vous transmettez en tant que paramètre à la fonction Where dans le deuxième exemple.

La différence entre ces deux syntaxes est purement syntaxique. Le deuxième style linq utilisant des appels de méthode est de savoir comment cela fonctionne sous le capot. Le premier est censé être plus convivial/plus facile et le compilateur le convertit en appels de méthode dans les coulisses. Ils devraient fonctionner de la même manière pour n'importe quelle requête, bien que le compilateur puisse bien sûr choisir une interprétation légèrement différente d'une requête linq compliquée que lors de la conversion en style de méthode.

Cet article msdn peut également vous intéresser: LINQ Query Syntax versus Method Syntax . "En général, nous recommandons la syntaxe de requête car elle est généralement plus simple et plus lisible; cependant il n'y a pas de différence sémantique entre la syntaxe de la méthode et la syntaxe de la requête."

34
Chris