• 委托学习续:Action、Func和Predicate


    我们先看一个上一章的委托的例子:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Test
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             new Program();
    14 
    15             Console.ReadKey();
    16         }
    17 
    18         public delegate void AddDelegate(float a, int b);
    19 
    20         public Program()
    21         {
    22             AddDelegate add = addFunc;
    23 
    24             add(11.11f, 123);
    25         }
    26 
    27         private void addFunc(float a, int b)
    28         {
    29             double c = a + b;
    30             Console.WriteLine(c);
    31         }
    32     }
    33 }

    Action:

    Action可以看做C#为我们提供的内置的没有返回值的委托,用在第一个例子里可以去掉委托的声明,代码如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Test
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             new Program();
    14 
    15             Console.ReadKey();
    16         }
    17 
    18         public Program()
    19         {
    20             //指定好参数数量和类型即可立即使用, 无需显示的定义委托
    21             Action<float, int> add = addFunc;
    22 
    23             add(11.11f, 123);
    24         }
    25 
    26         private void addFunc(float a, int b)
    27         {
    28             double c = a + b;
    29             Console.WriteLine(c);
    30         }
    31     }
    32 }

    同时,匿名函数和Lambda的写法也是允许的,详情可以查看上一篇笔记。

    Func:

    类似Action,Func是C#为我们提供的内置的具有返回值的委托,而返回值的类型为最后一个被指定的类型,请看下面的例子:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Test
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             new Program();
    14 
    15             Console.ReadKey();
    16         }
    17 
    18         public Program()
    19         {
    20             //指定好参数数量和类型即可立即使用, 无需显示的定义委托
    21             //对于 Func 委托来说, 最后指定的类型为返回的类型
    22             Func<float, int, string> add = addFunc;
    23 
    24             string result = add(11.11f, 123);
    25             Console.WriteLine(result);
    26         }
    27 
    28         private string addFunc(float a, int b)
    29         {
    30             double c = a + b;
    31             Console.WriteLine(c);
    32             return "hello: " + c.ToString();
    33         }
    34     }
    35 }

    Predicate:

    该委托专门用于过滤集合中的元素,下面我们看一个例子,保留数组中的正整数:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Test
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             new Program();
    14 
    15             Console.ReadKey();
    16         }
    17 
    18         public Program()
    19         {
    20             //指定的类型为需要过滤的数组的元素类型
    21             Predicate<int> filter;
    22             filter = IntFilter;
    23 
    24             int[] nums = new int[8]{12, -33, -89, 21, -15, 29, 40, -52};
    25             //开始进行过滤, 返回 true 表示留下当前元素
    26             int[] result = Array.FindAll(nums, filter);
    27 
    28             for(int i = 0; i < result.Length; i++)
    29             {
    30                 Console.WriteLine(result[i]);
    31             }
    32         }
    33 
    34         private bool IntFilter(int i)
    35         {
    36             if (i >= 0)
    37             {
    38                 return true;
    39             }
    40             return false;
    41         }
    42     }
    43 }
  • 相关阅读:
    docker 删除所有的 docker ps -a 记录
    使用ES6的Promise完美解决回调地狱
    linux查看历史命令history
    linux命令补全 忘记命令只记得开头
    linux更改shell
    java信号量PV操作 解决生产者-消费者问题
    eclipse代码自动提示功能设置
    linux下mysql修改数据库账户root密码
    IntelliJ Idea12 破解码与中文乱码配置
    linux usermod修改用户所在组方法
  • 原文地址:https://www.cnblogs.com/hammerc/p/4422940.html
Copyright © 2020-2023  润新知