Func用法

What is Func?

Func 是指定参数的委托. 在 C#, 一个委托指向了一个方法. 当调用者执行委托时,调用者称之为它的目标方法. 目标方法在某些时候可以为我们提供灵活性并让事情变得简单。

我们可以使用Func委托呈现一个没有显式声明参数的自定义委托方法。
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 of  Func  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);
翻译地址


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值