这篇文章主要介绍了C#中常见的系统内置委托用法,主要包括了Action类的委托、Func类的委托、Predicate
一般来说,C#在公共语言运行时(CLR)环境中系统为我们内置了一些常用的委托,包括Action类的委托、Func类的委托、Predicate
就像我们自己已定义好的一样,要实现某些功能,我们可以直接利用系统内置委托,实例化它们,而不必显式定义一个新委托并将命名方法分配给该委托。如:
1
2
3
4
5
6
7
8
9
|
public
static
void
Test()
{
Console.WriteLine(
"Just For Test"
);
}
static
void
Main(
string
[] args)
{
Action a =
new
Action(Test);
//直接实例化一个Action委托,不用自己再定义新委托
a();
}
|
只要了解了该系统内置委托是干什么的,传什么参数,返回什么值,大家就可以仿上述例子自行调用,不再赘述。下面是我对这四类委托的总结,并附有结合匿名方法与Lambda表达式的范例,两种方法实现的结果一样,大家可举一反三,灵活运用。
一、Action类的委托
1.Action委托 封装一个方法,该方法不具有参数并且不返回值
2.Action
3.Action
…… ……
17.Action
下面以Action
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
static
void
Main(
string
[] args)
{
#region Action
//需求:打印出整型集合list的元素
List<
int
> list =
new
List<
int
>() { 1, 2, 3, 4, 5 };
//将匿名方法分配给 Action
Action<
int
> concat1 =
delegate
(
int
i) { Console.WriteLine(i); };
list.ForEach(concat1);
//将 lambda 表达式分配给 Action
Action<
int
> concat2 = (i => Console.WriteLine(i));
list.ForEach(concat2);
Console.ReadKey();
#endregion
}
|
总结:
Action类的委托最少可以传入0个参数,最多可以传入16个参数,参数类型皆为逆变,并且不返回值。
二、Func类的委托
1.Func(TResult)委托封装封装一个不具有参数但却返回 TResult 参数指定的类型值的方法
2.Func(T,TResult)委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法
3.Func(T1,T2,TResult)委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法
…… ……
17.Func
下面以Func
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static
void
Main(
string
[] args)
{
#region Func
//需求:查找整型集合list中大于3的所有元素组成的新集合,并打印出集合元素
List<
int
> list =
new
List<
int
>() { 1, 2, 3, 4, 5 };
//将匿名方法分配给 Func
Func<
int
,
bool
> concat1 =
delegate
(
int
i) {
return
i > 3; };
var newlist1 = list.Where(concat1).ToList();
//将 Lambda 表达式分配给 Func
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
}
|
总结:
Func类的委托最少可以传入输入泛型参数(in,逆变) 1个,最多可以传入输入泛型参数(in,逆变) 16个,传入的输出泛型参数(out,协变)有且只有一个,这个类型是此委托封装的方法的返回值类型。
三、Predicate
表示定义一组条件并确定指定对象是否符合这些条件的方法
下面给出Predicate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static
void
Main(
string
[] args)
{
#region Predicate
//需求:查找整型集合list中大于3的所有元素组成的新集合,并打印出集合元素
List<
int
> list =
new
List<
int
>() { 1, 2, 3, 4, 5 };
//将匿名方法分配给 Predicate
Predicate<
int
> concat1 =
delegate
(
int
i) {
return
i > 3; };
var newlist1 = list.FindAll(concat1);
//将 lambda 表达式分配给 Predicate
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
}
|
总结:
Predicate
四、Comparison
表示比较同一类型的两个对象的方法
下面给出Comparison
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static
void
Main(
string
[] args)
{
#region Comparison
//需求:将整型集合list中的所有元素倒序排列打印出来
List<
int
> list =
new
List<
int
>() { 1, 2, 3, 4, 5 };
//将匿名方法分配给 Comparison
Comparison<
int
> concat1 =
delegate
(
int
i,
int
j) {
return
j - i; };
//将 lambda 表达式分配给 Comparison
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
}
|
总结:
Comparison
值 | 含义 |
小于0 | x 小于y |
0 | x 等于y |
大于0 | x 大于y |