2013-10-04 11 views
5

* Sebbene si tratti di una domanda duplicata, non avevo mai visto l'espressione "=>" nel codice precedente. Se avessi saputo che si trattava in particolare di un'espressione lambda, avrei cercato su google e l'avrei capito da solo. Grazie!Cosa significa => in un'espressione Linq

Sono nuovo di utilizzare Linq, quindi l'uso di "=>" mi ha davvero confuso quando mi sono imbattuto in essa in questo codice:

using System; 
using System.Linq; 
using System.Collections.Generic; 

public static class Extend 
{ 
    public static double StandardDeviation(this IEnumerable<double> values) 
    { 
     double avg = values.Average(); 
     return Math.Sqrt(values.Average(v=>Math.Pow(v-avg,2))); 
    } 
} 

Fonte: Standard deviation of generic list?

Alcune domande: Cosa fa => fare qui? Intellisense mi dice che "v" è un int, ma non è mai stato dichiarato. Come funziona?

+3

Google lambda in .NET. È un argomento importante, ma puoi leggerlo facilmente. –

risposta

8

Questa notazione => significa espressione lambda

esempio:

Enumerable.Range(0,100).Where(x=>x==1); 

qui x=> x==1 è un delegato anonimo accettare int come parametro e ritorno bool. Si tratta di:

delegate bool SomeDelegate(int x); 

e si può assegnare corpo del delegato:

bool Function(int x) 
{ 
    return x==1; 
} 

un'espressione lambda è una funzione anonima che è possibile utilizzare per creare delegati o tipi di albero di espressione. Utilizzando le espressioni lambda , è possibile scrivere funzioni locali che possono essere passate come argomenti o restituite come valore delle chiamate di funzione. Le espressioni Lambda sono particolarmente utili per scrivere le espressioni della query LINQ .

Per creare un'espressione lambda, specificare i parametri di input (se presenti) sul lato sinistro dell'operatore lambda =>, e inserire l'espressione o il blocco di istruzioni sull'altro lato. Ad esempio, l'espressione lambda x => x * x specifica un parametro denominato x e restituisce il valore di x al quadrato. È possibile assegnare questa espressione a un tipo delegato , come nell'esempio seguente:

fonte: Read about lambda expressions

Ecco un SO domanda sul perché utilizzare lambda: C# Lambda expressions: Why should I use them?

+9

Non riesco a credere che un semplice copia-incolla di wikipedia abbia ottenuto molti voti positivi. Anche la domanda era abbastanza facilmente googlable e dovrebbe essere chiusa –

+0

@TonyTheLion 1. Non è wikipedia 2. Ero prepairing esempio adatto, che può essere trovato ora nella mia risposta – wudzik

+0

L'operatore => può essere utilizzato in due modi in C#: Come operatore lambda in un'espressione lambda, separa le variabili di input dal corpo lambda. In una definizione del corpo dell'espressione, separa un nome membro dall'implementazione del membro. –

1

=> è il notazione per un Lamdba expression, che è fondamentalmente un modo a mano libera di scrivere un metodo anonimo :)

Si dedurrà automaticamente anche i tipi in cui può, quindi è per questo che v non viene mai dichiarato come int, ma è comunque compreso dal compilatore come int.

+4

questo potrebbe essere un commento non una risposta – apomene

+1

Penso che sia duro. Il problema con => è che è difficile da cercare se non si sa che ha a che fare con le espressioni Lambda – guymid

+0

risposta solo link ... – ChrisWue

6

l'operatore => non ha nulla a che fare con linq - è un lambda expression. È usato per creare funzioni anonime, quindi non è necessario creare una funzione completa per ogni piccola cosa.

quindi l'espressione:

s => s + 5 

potrebbe essere tradotto a:

int fun(int s) 
{ 
return s + 5; 
} 
1

si può anche leggere this very short article, è un ottimo riassunto di quello che è un espressioni lambda, come usarlo e quando.

L'esempio riportato è

List<int> numbers = new List<int>{11,37,52}; 
List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList(); 
//Now oddNumbers is equal to 11 and 37 

alla linea 2, oddNumbers è ora uguale a numeri dove number % 2 è uguale a 1, quindi dove numero è dispari

1

Per comprendere meglio questo. Vorrei riscrivere il codice senza LINQ, come di seguito:

public static class Extend 
    { 
     public static double StandardDeviation(this IEnumerable<double> values) 
     { 
      double avg = values.Average(); 
      var newValues = new List<double>(); 
      foreach (var v in values) 
      { 
       newValues.Add(Math.Pow(v - avg, 2)); 
      } 

      return Math.Sqrt(newValues.Average()); 
     } 
    } 

Ora è possibile confrontare queste due versioni del codice e vedere il rapporto.