2012-09-11 34 views
1

我有以下代碼:C#轉換動作<int>以拉姆達

int[] iArray = new int[] { 2, 3, 4 }; 
Action<int> action = new Action<int>(ShowSquares); 
Array.ForEach(iArray, action); 

private static void ShowSquares(int val) 
{ 
    Console.WriteLine("{0:d} squared = {1:d}", val, val * val); 
} 

儘管此代碼的工作,我想第二線

Action<int> action = new Action<int>(ShowSquares); 

轉換爲使用lambda表達式。

這可能嗎?

TIA

+0

你爲什麼要這麼做? – Arran

+0

看看是否可以完成。我正在嘗試深入瞭解lambda表達式。 – coson

回答

3
int[] iArray = new int[] { 2, 3, 4 }; 
Array.ForEach(iArray, val => Console.WriteLine("{0:d} squared = {1:d}", val, val * val)); 

產生的將是與您的ShowSquares方法拉姆達。只要稍後不需要使用action,就可以在ForEach方法中內聯聲明它,而不是先聲明操作。此外,作爲一個練習,瞭解代表和lambda表達式,這是很好的,但在實踐中,我建議:

int[] iArray = new int[] { 2, 3, 4 }; 
foreach (var val in iArray) 
    Console.WriteLine("{0:d} squared = {1:d}", val, val * val)); 

或者,如果線下決賽將在其他地方重複使用,打破它背出來成ShowSquares方法。

3
Action<int> action = (a) => ShowSquares(a); 
+0

爲什麼圍繞(a)需要括號?這必須是個人喜好。我做了,沒有括號,LinqPad 4似乎並不介意。 – coson

+0

你說得對,他們是可選的(只是個人喜好)。我寧願不要擁有它們,因爲它會縮短代碼。您可能更喜歡它們,因爲它看起來更像是一個普通的方法聲明。 –

+0

當把這樣的lambda傳遞給一個函數時,我不會使用小括號,但是在賦值情況下,'= a =>'令牌對我來說看起來很奇怪/錯誤,所以我覺得像添加()代碼更清晰。 –

3
Array.ForEach(iArray, i=>ShowSquares(i)); 
+0

我喜歡這種方法。太糟糕了,我無法想到這一點。 – coson