C#内置泛型委托

Action

Action是无返回值的泛型委托。

Action 表示无参,无返回值的委托

Action<int,string> 表示有传入参数int,string无返回值的委托

Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

Action至少0个参数,至多16个参数,无返回值。

public void Test<T>(Action<T> action,T p)
{
action(p);
}

static void Main(string[] args)
        {
       #region Action<T>委托示例
            //需求:打印出整型集合list的元素
            List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
            //将匿名方法分配给 Action<T> 委托实例
            Action<int> concat1 = delegate(int i) { Console.WriteLine(i); };
            list.ForEach(concat1);
            //将 lambda 表达式分配给 Action<T> 委托实例
            Action<int> concat2 = (i => Console.WriteLine(i));
            list.ForEach(concat2);
            Console.ReadKey();
        #endregion 
        }

Func

Func是有返回值的泛型委托

Func<int> 表示无参,返回值为int的委托

Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b)
{
return func(a, b);
}


static void Main(string[] args)
        {
            #region Func<T,TResult>委托示例
            //需求:查找整型集合list中大于3的所有元素组成的新集合,并打印出集合元素
            List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
            //将匿名方法分配给 Func<T,TResult> 委托实例
            Func<int, bool> concat1 = delegate(int i) { return i > 3; };
            var newlist1 = list.Where(concat1).ToList();
            //将 Lambda 表达式分配给 Func<T,TResult> 委托实例
            Func<int, bool> concat2 = i => i > 3;
            var newlist2 = list.Where(concat2).ToList();
            newlist1.ForEach(i => Console.WriteLine(i.ToString()));
            newlist2.ForEach(i => Console.WriteLine(i.ToString()));
            Console.ReadKey();
            #endregion
        }

predicate

predicate 是返回bool型的泛型委托

predicate<int> 表示传入参数为int 返回bool的委托

Predicate有且只有一个参数,返回值固定为bool

public delegate bool Predicate<T> (T obj)

static void Main(string[] args)
        {
            #region  Predicate<T>委托示例
            //需求:查找整型集合list中大于3的所有元素组成的新集合,并打印出集合元素
            List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
            //将匿名方法分配给 Predicate<T> 委托实例
            Predicate<int> concat1 = delegate(int i) { return i > 3; };
            var newlist1 = list.FindAll(concat1);
            //将 lambda 表达式分配给 Predicate<T> 委托实例
            Predicate<int> concat2 = (c => c > 3);
            var newlist2 = list.FindAll(concat2);
            newlist1.ForEach(i => Console.WriteLine(i));
            newlist2.ForEach(i => Console.WriteLine(i));
       Console.ReadKey();
            #endregion
        }

Comparison

表示比较同一类型的两个对象的方法

public delegate int Comparison<T>(T x, T y);

static void Main(string[] args)
        {
            #region  Comparison<T>委托示例
            //需求:将整型集合list中的所有元素倒序排列打印出来
            List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
            //将匿名方法分配给 Comparison<T> 委托实例
            Comparison<int> concat1 = delegate(int i, int j) { return j - i; };
            //将 lambda 表达式分配给 Comparison<T> 委托实例
            Comparison<int> concat2 = (i, j) => j - i;
            list.Sort(concat1);
            list.ForEach(c => Console.WriteLine(c.ToString()));
            list.Sort(concat2);
            list.ForEach(c => Console.WriteLine(c.ToString()));
       Console.ReadKey();
            #endregion
        }

总结:

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

Func可以接受0个至16个传入参数,必须具有返回值

Action可以接受0个至16个传入参数,无返回值

Predicate只能接受一个传入参数,返回值为bool类型
Comparison<T>委托封装一个方法,该方法传入一个类型参数,这个参数是指要比较的对象的类型,此类型参数是逆变,同时接收两个同类型的参数(这两个参数就是要比较的两个对象,参数的类型就是传入的类型参数的类型),始终返回int类型的值,即一个有符号整数,指示 x 与 y 的相对值,如下表所示。

含义
小于0 x 小于y
0 x 等于y
大于0 x 大于y

详细参考:http://www.cnblogs.com/akwwl/p/3232679.html
https://www.cnblogs.com/0weibin/p/3955207.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容

  • 委托是一种定义方法签名的类型。当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。您可以通过委托实例调用...
    LH_晴阅读 1,807评论 0 3
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,713评论 2 9
  • 1.委托的声明 Delegate可以指定返回值类型;Aciton无返回值类型;Func的最后一个参数表示返回值类型...
    混世小码农阅读 351评论 0 1
  • 我们先来了解 python 内置的 ** strip() ** 方法,该方法用于移除字符串头尾指定的字符(默认为空...
    SingleDiego阅读 273评论 0 0
  • 电话反反复复打了多次,然而还是那样,我有些崩溃。小雷逃课不是一次两次,学校围墙是自然与人工的完美结合,铁栅栏加上栽...
    任风南阅读 241评论 0 0