What is Func?
Func 是指定参数的委托
. 在 C#, 一个委托指向了一个方法. 当调用者执行委托时,调用者称之为它的目标方法. 目标方法在某些时候可以为我们提供灵活性并让事情变得简单。
delegate TResult Func <out TResult> ();
delegate TResult Func <in T, out TResult> (T arg);<span style="color: rgb(17, 17, 17); font-family: 'Segoe UI', Arial, sans-serif; font-size: 14px;">…and then if we want to print the numbers which will have result less than 1 after divided by 5, we will write a method:</span>
delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2);
... and so on, up to T16
The Problem
为了理解Func
, 我们必须知道它能处理什么问题. 假如我们有一int型数组.
IEnumerable<int> numbers = new[] {3, 4, 7, 1, 8, 10, 21, 5, 9, 11, 14, 19};
这是一个简单的数组. 假如我们要打印大于是10的数字
, 我们会写下下面的方法.
我们将以上面的数组为参数并且输出一个新的大于10数字的数组。
public IEnumerable<int> GetGreaterThanTen(IEnumerable<int> numbers)
{
foreach (int number in numbers)
if (number > 10)
yield return number;
}
假如我们要打印除于5的余数大于1的数,我们会写下一个方法:
public IEnumerable<int> GetGreterThanOneAfterDevidedByFive(IEnumerable<int> numbers)
{
foreach (int number in numbers)
if ((number/5) > 1)
yield return number;
}
The Solution
根据上面的方法, 我们会以条件的不同写出不同的方法. 但是我们有更好的方法. 我们应该用委托来避免来写的新的方法. 用Func 作为方法参数将脱离调用者
和函数.
Func
将会传递函数体的规则.
public IEnumerable<int> GetNumbers(IEnumerable<int> numbers, Func<int, bool> numberResolver)
{
foreach (int number in numbers)
if (numberResolver(number))
yield return number;
}
IEnumerable<int> numbers = new[] {3, 4, 7, 1, 8, 10, 21, 5, 9, 11, 14, 19};
IEnumerable<int> greaterThanTen = GetNumbers(numbers, x=>x>10);
greaterThanTen.ToList().ForEach(Console.WriteLine);
Console.WriteLine("\n");
IEnumerable<int> greaterThanOneAfterDividedByFive = GetNumbers(numbers, n => (n/5) > 1);
greaterThanOneAfterDividedByFive.ToList().ForEach(Console.WriteLine);
上面的代码是相当自我解释的。
函数
使用
lambda表达式(Lambda expression),
它本质上是
一个匿名函数
。
Getting TResult
The x-factor ofFunc
is probably
Func<TResult>
. For
func
tional programming, 返回类型有很大的作用. For example:
IEnumerable<int> numbers = new[] { 3, 4, 7, 1, 8, 10, 21, 5, 9, 11, 14, 19 };
Func<IEnumerable<int>, IEnumerable<int>> getGreaterThanTen = nums =>
{
var array = new List<int>();
nums.ToList().ForEach(x =>
{
if (x > 10)
array.Add(x);
});
return array;
};
var result = getGreaterThanTen(numbers);
result.ToList().ForEach(Console.WriteLine);
翻译地址