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. SqlServer 中查询子节对应的上级自定义函数

    CREATE FUNCTION [dbo].[FN_TopGetOrgByUserName] ( @UserName NVARCHAR(128) ) RETURNS @showOrg TABLE(id ...

  2. mysql 日期操作 增减天数、时间转换、时间戳(转换)

    http://hi.baidu.com/juntao_li/item/094d78c6ce1aa060f6c95d0b MySQL datediff(date1,date2):两个日期相减 date1 ...

  3. Intellij Idea 使用时总是打开上次的项目

    Appearance&Behaviour-->>System Settings-->>Startup&Shutdown-->>Reopen last ...

  4. 关于Ocelot 网关结合Consul实现服务转发的坑爹问题

    下面是我的网关配置来验证下Ocelot的问题,如果只是做网关转发应该还ok,但是要是结合Consul来检查并健康的转发有效服务器还是有很多弊端 关键在于通过设置 DeregisterCriticalS ...

  5. MyBatis使用示例

    下面是一个简单的MyBatis使用DEMO. 整体结构 整体代码大致如下: POM依赖 需要引用两个jar包,一个是mybatis,另一个是mysql-connector-java,如果是maven工 ...

  6. 【AtCoder】ARC098题解

    C - Attention 枚举,计算前缀和即可 代码 #include <bits/stdc++.h> #define fi first #define se second #defin ...

  7. PHP获取访问者公网IP

    if(!empty($_SERVER["HTTP_CLIENT_IP"])){  $cip = $_SERVER["HTTP_CLIENT_IP"]; } el ...

  8. 文件基本操作 (C语言)

    一切皆文件 ---Linux 头文件 <stdio.h> 中定义了文件的相关操作 #include <stdio.h> 文件操作基本流程: 打开:fopen 相关操作 关闭:f ...

  9. InnoDB的锁机制浅析(四)—不同SQL的加锁状况

    不同SQL的加锁状况 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/ ...

  10. 一个简单的python练习题

    最近几天看了python的基础知识,也写了两篇博客:http://futuretechx.com/python2/和 http://futuretechx.com/python-basicknowl/ ...