Func、Action和Predicate是.NET自带的3个泛型委托方法,三个方法的区别其实并不大,要强行给混着用也是可以的,但是我们是有追求的人,把道理讲清楚总是好的。
一、Func是有返回值的方法(类似于Delphi里面的function),Func最多支持16个泛型参数和1个泛型返回值(最后一个固定为返回值),并且支持Lambda表达式
//无参数用法 Func<string> funcNone = delegate() { return "我是来打酱油的"; }; //无参数Lambda用法 Func<string> funcNoneLambda = () => "我是来打酱油的"; //一个参数用法 Func<string, bool> funcOne = delegate(string s) { return s.Contains("酱油"); }; //一个参数Lambda用法 Func<string, bool> funcOneLambda = s => s.Contains("酱油"); //两个参数用法 Func<int, int, int> funcTwo = delegate(int one, int two) { return one + two; }; //两个参数Lambda用法 Func<int, int, int> funcTwoLambda = (one, two) => one + two;
二、Action是无返回值的方法(类似于Delphi里面的procedure),Action也是最多支持16个泛型参数,并且支持Lambda表达式
//一个参数用法 Action<string> actionOne = delegate(string s) { Console.Write(s); }; //一个参数Lambda用法 Action<string> actionOneLambda = c => Console.Write(c);
三、Predicate比较特殊,它只有一个参数,而且只返回一个布尔值,并且支持Lambda表达式
//Predicate用法 Predicate<string[]> predicate = delegate(string[] s) { var result = from p in s where p.Contains("c") select p; return result.ToList().Count > 0 ? true : false; }; //Predicate Lambda用法 Predicate<string[]> predicateLambda = s => { var result = from p in s where p.Contains("c") select p; return result.ToList().Count > 0 ? true : false; };