2013-10-04 20 views
5

*雖然這是一個重複的問題,但我從來沒有在代碼中看過表達式「=>」。如果我知道這是一個lambda表達式,我會自己google了一下,然後想出來。謝謝!=> Linq表達式中的意思是什麼

我是新來使用LINQ,所以使用「=>」真糊塗我,當我在此代碼通過它跑:

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))); 
    } 
} 

來源:Standard deviation of generic list?

的幾個問題: =>在這裏做什麼? Intellisense告訴我'v'是一個int,但它從未被聲明。這個怎麼用?

+3

Google lambda在.NET中。它是一個很大的主題,但您可以輕鬆閱讀它。 –

回答

8

此符號=>意味着lambda表達式

例如:

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

這裏x=> x==1是匿名委託接受int作爲參數並返回bool。它是:

delegate bool SomeDelegate(int x); 

並且您可以委託指定機構:

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

lambda表達式是匿名函數,你可以用它來創建 委託或表達式樹類型。通過使用lambda 表達式,您可以編寫可作爲 參數傳遞或作爲函數調用的值返回的本地函數。 Lambda 表達式對編寫LINQ查詢 表達式特別有幫助。

要創建lambda表達式,可以在lambda運算符左側指定輸入參數(如果有的話) =>,並將表達式 或語句塊放在另一側。例如,lambda 表達式x => x * x指定一個名爲x的參數,並返回x平方的值。你可以這樣表達分配給委託 類型,如下例所示:

來源: Read about lambda expressions

這裏是關於爲什麼要使用lambda表達式一個SO問題:C# Lambda expressions: Why should I use them?

+9

我不能相信從維基百科直接複製粘貼了許多upvotes。此外,問題很容易Googlable,應該關閉 –

+0

@TonyTheLion 1.它不是維基百科2.我正在準備適合的例子,現在可以在我的回答中找到 – wudzik

+0

=>運算符可以在C#中使用兩種方式: 作爲lambda表達式中的lambda運算符,它將輸入變量從lambda體中分離出來。 在表達式體定義中,它將成員名稱與成員實現分開。 –

1

=>是符號爲Lamdba expression,這基本上是一種寫​​匿名方法的簡單方式:)

它也會自動推斷類型在哪裏它可以,所以這就是爲什麼v從未被聲明爲int,但編譯器將其理解爲無論如何。

+4

這可能是一個評論,而不是答案 – apomene

+1

我認爲這是苛刻的。與=>的問題是,很難搜索,如果你不知道它是與Lambda表達式 – guymid

+0

僅鏈接答案... – ChrisWue

6

運營商=>與linq無關 - 這是一個lambda expression。它被用來創建匿名函數,所以你不需要爲每一件小事情創建一個完整的函數。

這樣表達:

s => s + 5 

可以翻譯成:

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

您還可以閱讀this very short article,它是什麼是一個lambda表達式的一個很好的總結,如何使用它什麼時候。

給出的例子是

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 

在第2行,oddNumbers現在等於號碼其中number % 2等於1,所以在那裏數爲奇數

1

爲了更好地理解這一點。我會重寫你的代碼,而LINQ如下:

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()); 
     } 
    } 

現在你可以比較的代碼,這兩個版本,看到了關係。