C#的泛型委托Predicate/Func/Action转 泛型委托

Predicate

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

类型参数介绍:

T: 要比较的对象的类型。

obj:要按照由此委托表示的方法中定义的条件进行比较的对象。

返回值:如果 obj符合由此委托表示的方法中定义的条件,则为 true;否则为false

看下面代码

publicclassGenericDelegateDemo
{
List<String>listString=newList<String>()
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};

String[]arrayString=newString[]
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};

publicString[]GetFirstStringFromArray()
{
returnArray.FindAll(arrayString,(c)=>{returnc.Length<=3;});
}

publicList<String>GetFirstStringFromList()
{
returnlistString.FindAll((c)=>{returnc.Length<=3;});
}

publicString[]GetFirstStringFromArray_1()
{
returnArray.FindAll(arrayString,GetString);
}

publicList<String>GetFirstStringFromList_1()
{
returnlistString.FindAll(GetString);
}

privateboolGetString(Stringstr)
{
if(str.Length<=3)
returntrue;
else
returnfalse;
}
}

(1)首先,上面以 数组和泛型List 两个集合作为演示对象,并构建集合。

(2)接着,两者同时使用各自 所有的 FindALL方法,参见如下定义:

Array :public T[] FindAll<T>(T[] array,Predicate<T> match);

List:public List<T>FindAll(Predicate<T> match);

注意的是,两处的FindAll 均采用了Predicate (泛型委托)作为参数的类型。

(3)接着,使用两者方式展现 对Predicate 的使用:

第一种: (c) => { return c.Length<= 3; };

第二种:GetString(String str)。

这两者在语法上明显不同,但是实际是做相同的事情,第一种是使用Lambda表达式构建的语句,关于Lambda这里不做详述,请参见笔者C#3.0特性相关文章。

补充的是你也可以这样写,

delegate(String c){returnc.Length<=3;}作为 Predicate定义的参数

完整代码:

XX.FindAll(delegate(Stringc){returnc.Length<=3;});

这应该称为匿名代理了。

其他使用到Predicate 有

Array.Find , Array.FindAll , Array.Exists ,Array.FindLast , Array.FindIndex .....

List<T>.Find ,List<T>.FindAll ,List<T>.Exists ,List<T>.FindLast ,List<T>.FindIndex .....

延伸:

除了上面提到的外,你完全可以使用Predicate 定义新的方法,来加强自己代码。

publicclassGenericDelegateDemo
{
C#的泛型委托Predicate/Func/Action(转) 泛型委托
List<String>listString=newList<String>()
{
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};
publicStringGetStringList(Predicate<String>p)
{
foreach(stringiteminlistString)
{
if(p(item))
returnitem;
}
returnnull;
}

publicboolExistString()
{
stringstr=GetStringList((c)=>{returnc.Length<=3&&c.Contains('S');});
if(str==null)
returnfalse;
else
returntrue;
}
}

同样解决了上面的问题,这里罗嗦了只是为说明Predicate的用法而已。

对于Predicate的应用当然这不是什么新鲜事情,今天细细思味一番,觉得C# 真是一门优雅的语言。

以供初学者参考。

笔者本想对以下几种泛型委托一一做些介绍和总结的,在理解Predicate的过程中,发现只要理解了泛型、委托和匿名代理,

当然你晓得Lambda表达式更好,就完全可以在适当的时候灵活应用他们了。也就是说,只是定义不同的delegate而已,

一是 你可以自己定义这样的delegate,再行使用;

二是你需要知道象Predicate、Func、Action这样的已有好的delegate是如何定义的。或者使用的时候适当查阅下MSDN即可。

如:

Func():封装一个不具有参数但却返回 TResult 参数指定的类型值的方法。

Func(T1, T2, TResult):封装一个具有两个参数并返回 TResult参数指定的类型值的方法,没有T2就是封装一个具有参数并....。

Action() Action(T1) Action(T2) :封装一个方法,该方法指定数量的参数(如()无参数,(T1)一个参数,以此类推)并且不返回值。这个和Func有相似处,但无返回值而已。

提醒大家的注意的是:

x=>x+x;

X=> {returnx+x;} 是等价的。

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/274832.html

更多阅读

怎样使用C#的月历MonthCalendar 控件 c panel控件的使用

怎样使用C#的月历【MonthCalendar】控件——简介 C#中的日历控件【MonthCalendar】是比较常用的一个控件,可以让用户对日期进行快速的查看和设置、也可以选择一段所需要的日期时间段。 下面介绍一下几种日历控件常用的使用方法。怎

街拍:玉腿颀长、身材高挑的清秀型美女

:玉腿颀长、身材高挑的清秀型美女  (2014-04-11 06:26:48)转载▼标签:美女街拍三里屯太古里娱乐休闲人像摄影一个女人,如果高胸、翘臀、长腿,那一定成为众人瞩目的焦点。如果再拥有高挑的身材,如果再面庞清丽可人,那就是数倍的傲人了。

维生素C的生理功能和来源 维生素d的生理功能

维生素C的生理功能和来源维生素C也称抗坏血酸,是高度水溶性维生素类,也是人体最容易缺乏的维生素,人体一旦严重缺乏,会引起全身出血性坏血病。维生素C的结构性质不稳定,所以极易被破坏,尽管各种食物中含有大量维生素C,但因其怕热、怕氧化

声明:《C#的泛型委托Predicate/Func/Action转 泛型委托》为网友血染素衣泪倾城分享!如侵犯到您的合法权益请联系我们删除