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. Java编程的逻辑 (57) - 二进制文件和字节流

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  2. PYTHON 写入list并换行的方法

    f.writelines(lists) 是不换行的写入,可用以下方法在写入时换行. 方法一: for line in lists: f.write(line+'\n') 方法二: lists=[lin ...

  3. Jupyter notebook安装与使用

    Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 安装 安装python 3 pip安装 pip3 install - ...

  4. RN组件可用属性整理

  5. 洛谷P4742 [Wind Festival]Running In The Sky [Tarjan缩点,DAGDP]

    题目传送门 Running In The Sky 格式难调,题面就不放了. 分析: 一句话题意:给定一张带点权的有向图,求最长点权路径及该路径上的最大点权. 很明显的$DAGDP$,因此需要缩点,将该 ...

  6. 设计模式-装饰者模式(Decorator Pattern)

    本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...

  7. GBDT算法

    GBDT通过多轮迭代,每轮迭代产生一个弱分类器,其中弱分类器通常选择为CART树,每个分类器在上一轮分类器的残差基础上进行训练. 对于GBDT算法,其中重要的知识点为: 1.GBDT是梯度下降法从参数 ...

  8. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

    题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路 ...

  9. 【转载】CMenu自绘---钩子---去除边框

    使用默认的CMenu菜单类或者继承CMenu实现的菜单扩展类,在显示的时候最外层都会有边框出现,或者说是具有3D外观(菜单阴影不算),当改变菜单背景色或者需要加个边框线时就会看上去很不美观.看过很多菜 ...

  10. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem C. Cargo Transportation 暴力

    Problem C. Cargo Transportation 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed ...