Answers:
Predicate
:本质上Func<T, bool>
; 提出问题“指定的参数是否满足委托代表的条件?” 用于List.FindAll之类的东西。
Action
:执行给定参数的操作。非常通用。基本上,它在LINQ中使用不多,因为它暗示了副作用。
Func
:在LINQ中广泛使用,通常用于转换参数,例如通过将复杂结构投影到一个属性。
其他重要代表:
EventHandler
/ EventHandler<T>
:在整个WinForms中使用
Comparison<T>
:喜欢,IComparer<T>
但采用代理人形式。
EventHandler/EventHandler<T>
也出现在WinForms之外。
Action
,Func
并且Predicate
都属于代表家庭。
Action
:操作可以接受n个输入参数,但返回void。
Func
:Func可以接受n个输入参数,但始终会返回所提供类型的结果。Func<T1,T2,T3,TResult>
,这里T1,T2,T3是输入参数,TResult是它的输出。
Predicate
:谓词也是Func的一种形式,但它始终会返回bool。简单来说,它是的包装Func<T,bool>
。
带lambda的Action和Func:
person p = new person();
Action<int, int> mydel = p.add; /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1= mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();
Func对LINQ更友好,可以作为参数传递。(无积分)
谓词不能,必须重新包装。
Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;
new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again
new []{2,-4}.Where(IsPositivePred); //Compile Error
new []{2,-4}.Where(IsPositiveFunc); //Func as Parameter
一个简单的例子,关于参数以及每种类型的含义
该Func接受两个int参数并返回一个int.Func始终具有返回类型
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 5));//Print 8
在这种情况下,func没有参数,但是返回一个字符串
Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world
该操作采用两个int参数,并返回void
Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6
该谓词采用一个参数并始终返回布尔值。通常,谓词始终返回bool。
Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
System.Converter<TInput, TOutput>
,虽然很少使用。