it-swarm.it

È Linq o Lambda?

So che questo è Linq:

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

E so che questo è Lambda:

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

Nota del redattore: quanto sopra non è semplicemente Lambda, è Linq che usa la "Sintassi del metodo" il cui predicato è Lambda. Per essere chiari, entrambi i campioni sopra riportati sono Linq (il mio post originale non era corretto, ma ho lasciato l'errore per illustrare la confusione che ha portato alla domanda).

Ma Linq è un sottoinsieme di Lambda o cosa?

Perché ci sono due tecnologie apparentemente identiche?

C'è un motivo tecnico per scegliere l'uno rispetto all'altro?

96

Questo è LINQ (usando la sintassi della query):

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

Questo è anche LINQ (usando la sintassi del metodo):

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

È interessante notare che entrambi questi gusti finirà per produrre lo stesso identico codice. Il compilatore ti offre un servizio permettendoti di esprimere i tuoi desideri nel modo che preferisci.

E questo è un lambda:

x => x.Value == 1

Quando si sceglie di utilizzare la sintassi del metodo, LINQ viene quasi sempre visualizzato attorno alle espressioni lambda. Ma LINQ e lambdas sono due cose totalmente diverse, che possono essere usate entrambe da sole.

Aggiornamento: Come giustamente sottolinea svick, LINQ con sintassi della query è anche implementato usando espressioni lambda (come menzionato in precedenza, il compilatore ti permette di scrivere nella sintassi della query ma la trasforma efficacemente in sintassi del metodo alle tue spalle). Questo si sta solo accumulando sul fatto che entrambi i sapori sono totalmente equivalenti e si comporteranno allo stesso modo (ad esempio le espressioni lambda possono causare chiusure da creare).

125
Jon

Entrambi sono Linq. Il secondo è utilizzando Lambdas .

Le lambda sono le cose del tipo di metodo inline che stai passando come parametro alla funzione Where nel secondo esempio.

La differenza tra queste due sintassi è puramente sintattica. Il secondo stile linq che usa le chiamate di metodo è come funziona sotto il cofano. Il primo è pensato per essere più facile/intuitivo e il compilatore lo converte in chiamate di metodo dietro le quinte. Dovrebbero funzionare allo stesso modo per qualsiasi query, anche se ovviamente il compilatore può scegliere un'interpretazione leggermente diversa di una query linq complicata rispetto a quando si converte in stile metodo.

Anche questo articolo msdn può essere interessante: Sintassi della query LINQ rispetto alla sintassi del metodo . Di particolare rilevanza è: "In generale, si consiglia la sintassi della query perché di solito è più semplice e più leggibile; tuttavia non vi è alcuna differenza semantica tra la sintassi del metodo e la sintassi della query".

34
Chris