# PLINQ 和 TPL 中的 Lambda 運算式

## Func 委派

Func 委派所封裝的方法會傳回值。 在 Func 簽章中，最後一個或最右邊的類型參數一律會指定傳回類型。 其中一個常見的編譯器錯誤原因是嘗試將兩個輸入參數傳入 System.Func<T,TResult>；事實上，此型別只會採用一個輸入參數。 .NET 會定義 17 個 Func 版本： System.Func<TResult>System.Func<T,TResult>System.Func<T1,T2,TResult> 等等， 到 System.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>

## Action 委派

System.Action委派會在未傳回值的Visual Basic) 中封裝 (Sub 的方法。 Action在類型簽章中，類型參數只代表輸入參數。 如同 Func ，.NET 會從沒有類型參數的版本定義 17 個版本 Action ，到具有 16 個類型參數的版本。

## 範例

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

{
// Demonstrated features:
// 		Parallel.ForEach()
// Expected results:
//      This example sums up the elements of an int[] in parallel.
//      Each thread maintains a local sum. When a thread is initialized, that local sum is set to 0.
//      On every iteration the current element is added to the local sum.
//      When a thread is done, it safely adds its local sum to the global sum.
//      After the loop is complete, the global sum is printed out.
// Documentation:
//		http://msdn.microsoft.com/library/dd990270(VS.100).aspx
static void Main()
{
// The sum of these elements is 40.
int[] input = { 4, 1, 6, 2, 9, 5, 10, 3 };
int sum = 0;

try
{
Parallel.ForEach(
input,					        // source collection
() => 0,					        // thread local initializer
(n, loopState, localSum) =>		// body
{
localSum += n;
return localSum;
},
);

Console.WriteLine("\nSum={0}", sum);
}
// No exception is expected in this example, but if one is still thrown from a task,
// it will be wrapped in AggregateException and propagated to the main thread.
catch (AggregateException e)
{
Console.WriteLine("Parallel.ForEach has thrown an exception. THIS WAS NOT EXPECTED.\n{0}", e);
}
}
}

Imports System.Threading

Module ForEachDemo

' Demonstrated features:
'   Parallel.ForEach()
' Expected results:
'   This example sums up the elements of an int[] in parallel.
'   Each thread maintains a local sum. When a thread is initialized, that local sum is set to 0.
'   On every iteration the current element is added to the local sum.
'   When a thread is done, it safely adds its local sum to the global sum.
'   After the loop is complete, the global sum is printed out.
' Documentation:
'   http://msdn.microsoft.com/library/dd990270(VS.100).aspx
Private Sub ForEachDemo()
' The sum of these elements is 40.
Dim input As Integer() = {4, 1, 6, 2, 9, 5, _
10, 3}
Dim sum As Integer = 0

Try
' source collection
Parallel.ForEach(input,
Function()
Return 0
End Function,
Function(n, loopState, localSum)
' body
localSum += n
Return localSum
End Function,
Sub(localSum)
End Sub)

Console.WriteLine(vbLf & "Sum={0}", sum)
Catch e As AggregateException
' No exception is expected in this example, but if one is still thrown from a task,
' it will be wrapped in AggregateException and propagated to the main thread.
Console.WriteLine("Parallel.ForEach has thrown an exception. THIS WAS NOT EXPECTED." & vbLf & "{0}", e)
End Try
End Sub

End Module