Predicate

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
通过查看源码发现

Predicate  Array

先来看一下Array.FindAll

构建一个字符串类型的数组进行演示测试

第一种方式

            string[] arrayString = new string[]
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};
string[] arrayResult = Array.FindAll(arrayString, (c) => c.Length > );

如上图所示FindAll两个参数第一个就是数组(字符串数组,int数组等等),第二个就是委托Predicate有一个参数。

上面的演示测试功能就是 测试字符串数组中的项的长度大于3的就返回,可以看出应该是有6个

下面来看一下测试结果

(c) => c.Length > 3 此处这就是一个lambda表达式
第二种方式
        public void PredicateArrayTest()
{
string[] arrayString = new string[]
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};
string[] arrayResult = Array.FindAll(arrayString, (c) => c.Length > );
string[] arrayResultMethod = Array.FindAll(arrayString, GetString);
}
private bool GetString(string item)
{
if (item.Length > )
{
return true;
}
return false;
}

通过一个GetString方法,也就是通过委托进行传递方法的方式

查看效果,结果是一样的

第三种方式
 string[] arrayResultDelegate = Array.FindAll(arrayString, delegate(string c) { return c.Length > ; });

直接通过匿名代理可以达到同样的效果。

查看源代码可以发现,Array数组的其他很多方法同样都使用了Predicate委托

再写一个简单的小例子进行巩固一下对Precidate委托的使用

        public string PredicateNewTest(Predicate<string> item )
{
string[] arrayString = new string[]
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};
foreach (string str in arrayString)
{
if (item(str))
{
return str;
}
}
return null; //return arrayString.FirstOrDefault(str => item(str));
}
[TestMethod]
public void PredicateNewTest()
{
string str = PredicateNewTest((c) => { return c.Length > ; });
}

通过下面的函数进行调用之后返回

Predicate  List

对List的实现其实和Array的实现原理几乎完全一样,暂时就不实现了,可以自己想想吧,之后看情况,自己再补上。

Func

可以很清楚的看出,封装一个带有返回 TResult 参数指定的类型值的方法,它有多个重载。下面我们通过委托来处理一下3*5=15的过程。

        public delegate string MultiTest(int a, int b);
[TestMethod]
public void ActionTest()
{
MultiTest muliti = new MultiTest(MultiMethod);
string result=muliti(, );
} public string MultiMethod(int a,int b)
{
return (a*b).ToString();
}

其中:定义一个有两个int类型参数的,返回值为字符串的委托。声明一个乘法的方法,并且返回字符串,然后调用。

那么现在我们来使用Func来优化的代码是什么样呢

        public string MultiMethod(int a,int b)
{
return (a*b).ToString();
} [TestMethod]
public void FuncTest()
{
Func<int,int,string> func=new Func<int, int, string>(MultiMethod);
string result = func(, );
}

结果为

是不是很简单呢,那么你自己也试一下吧。

Action

Action与Func极为类似,只不过Action执行没有返回值而已,那么应该就更简单一些了,在此就不进行示例讲解了。

 

C#泛型委托Predicate、Action、Func的更多相关文章

  1. 【Unity|C#】基础篇(11)——内置的泛型委托(Action/Func/Predicate)

    [Action] 无返回值 的泛型委托,可以有0~16个参数(函数重载) public delegate void Action(); // 无参数 public delegate void Acti ...

  2. 委托delegate,Action,Func,Predicate

    C#委托的介绍(delegate.Action.Func.predicate) 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 ...

  3. C# 委托应用总结(委托,Delegate,Action,Func,predicate)

    C# 委托应用总结 一.什么是委托 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执 ...

  4. 泛型委托 Predicate/Func/Action

    Predicate 泛型委托  表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.看看下面它的定义: // Summar ...

  5. C#的泛型委托Predicate/Func/Action(转)

    Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 类型参数介绍:    T: 要比较的对 ...

  6. C#语法糖之第六篇: 泛型委托- Predicate<T>、Func<T>

    今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看 ...

  7. C#内置泛型委托:Action委托

    1.什么是Action泛型委托 Action<T>是.NET Framework内置的泛型委托,可以使用Action<T>委托以参数形式传递方法,而不用显示声明自定义的委托.封 ...

  8. C#的泛型委托Predicate/Func/Action

    Predicate<T> 是一个委托,它代表了一个方法,它的定义是: namespace System {    // 摘要:    表示定义一组条件并确定指定对象是否符合这些条件的方法. ...

  9. 对委托 以及 action func 匿名函数 以及 lambda表达式的简单记录

    class Program { public delegate void MyDelegate(string str); static void Main(string[] args) { // My ...

随机推荐

  1. 执行了‘“npm install mysql"

    http是核心模块,封装到安装包里面了,如果在你项目的当前目录下<code>npm install mysql<code>的话就会在你当前目录下的node_modules文件夹 ...

  2. 第三届CCF软件能力认证

    1.门禁系统 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个编号,每条记录用读者的编号来表示.给出读者的来访记录,请问每一条记录中的读者是第几次出现. 输入格式 ...

  3. 【LOJ】#6435. 「PKUSC2018」星际穿越

    题解 想出70的大众分之后就弃疗了,正解有点神仙 就是首先有个比较显然的结论,就是要么是一直往左走,要么是走一步右边,然后一直往左走 根据这个可以结合RMQ写个70分的暴力 我们就考虑,最优的话显然是 ...

  4. 002.SSH日常命令

    一 远程登陆 ssh 用户名@远程主机ip:首次登陆需要下载对方公钥. 实例:ssh 192.168.10.129 二 远程复制 scp root@远程主机ip:[远程主机文件绝对路径] [需要保存的 ...

  5. MIT-6.828-JOS-lab4:Preemptive Multitasking

    Lab 4: Preemptive Multitasking tags: mit-6.828, os 概述 本文是lab4的实验报告,主要围绕进程相关概念进行介绍.主要将四个知识点: 开启多处理器.现 ...

  6. odoo权限管理(二.记录管理)

    规则保存在ir.rule模型表里,需要设置关联某个模型,关联很多组,访问权限控制和domian. 通过domain_force过滤出的一些记录来执行约束. 例子:经理只能删除状态为'cancel'的客 ...

  7. BeagleBone Black教程之BeagleBone Black使用到的Linux基础

    BeagleBone Black教程之BeagleBone Black使用到的Linux基础 BeagleBone Black涉及到的Linux基础 在许多没有Linux相关经验的人看来,Linux看 ...

  8. 手把手教你做爬虫---基于NodeJs

    前言: 趁着北京今儿天气格外的蓝,我觉得我得干点什么,于是乎,卷起袖子,整理一下最近做爬虫的那些事儿. 目标:爬取北京大学软件与微电子学院的所有新闻,并将内容及图片存储到本地. 设计思路:经过对北京大 ...

  9. Codeforces.566F.Clique in the Divisibility Graph(DP)

    题目链接 \(Description\) 给定集合\(S=\{a_1,a_2,\ldots,a_n\}\),集合中两点之间有边当且仅当\(a_i|a_j\)或\(a_j|a_i\). 求\(S\)最大 ...

  10. Java多线程runnable

    主要为大家分享Java多线程怎么实现Runnable方式 一 :主要步骤 1.定义实现Runnable接口 2.覆盖Runnable接口中run方法,将线程要运行的代码存在run方法里 3.用Thre ...